【问题标题】:Non json output from gcloud ai-platform predict. Parsing non-json outputsgcloud ai-platform predict 的非 json 输出。解析非 json 输出
【发布时间】:2021-12-21 06:03:31
【问题描述】:

我正在使用gcloud ai-platform predict 调用端点并使用json-request 而不是json-response 获得如下预测

gcloud ai-platform predict --json-request instances.json

但是,响应不是json,并且无法进一步读取 hense,从而导致其他并发症。以下是回复。

VAL  HS
0.5  {'hs_1': [[-0.134501, -0.307326, -0.151994, -0.065352,  -0.14138]], 'hs_2' : [[-0.134501, -0.307326, -0.151994, -0.065352, 0.020759]]}

gcloud ai-platform predict 可以返回 json,或者可能以不同方式解析它。 ?

感谢您的帮助。

【问题讨论】:

  • 您可以检查您正在使用的任何 API,它是否可以以正确的 JSON 格式返回结果?您发布的不是
  • 这确实不是 JSON。如果您删除左大括号 { 之前(但不包括)之前的所有内容,并用 " 而不是 ' 括起来,就像 "lstm_1""lstm_2" 一样,它将成为正确的 JSON。
  • 是的,它不是 api 作为响应发送的 json。我相应地改变了问题。

标签: json google-api google-ai-platform


【解决方案1】:

显然,您的输出是一个包含标题和两列的表格:分数和(据称)JSON 内容。您应该提取任何首选数据行的第二列(您的示例只有一个,但通常您可能会收到几个分数-JSON 对)。也许您的 API 已经提供了提取某个“状态”的功能,例如得分最高的那个。如果没有,一个简单的awksed 脚本可以轻松完成这项工作。

然后,在拥有正确的 JSON(然后可以通过jq 查询)之前唯一剩下的问题是引用样式。您的输出使用 ' 而不是 "'lstm_1' 而不是 "lstm_1")包含字段名称。不幸的是,如果您可以期望接收到任意复杂的 JSON 数据(例如包含引号的字符串等),那么纠正瘦身并不是一件容易的事。但是,如果您的 JSON 总是像提供的示例中那样简单,那么对于 awksed 等工具来说,简单地将错误替换为正确的就变得容易了。

例如,在示例输出中使用sed 选择第二行(即第一个数据行),从头到尾删除所有内容,但不包括第一个左大括号(这标志着第二行的开始)列),进行上述替换并将结果通过管道传输到jq

... | sed -n "2{s/^[^{]\+//;s/'/\"/g;p;q}" | jq .
{
  "lstm_1": [
    [
      -0.13450142741203308,
      -0.3073260486125946,
      -0.15199440717697144,
      -0.06535257399082184,
      -0.1413831114768982
    ]
  ],
  "lstm_2": [
    [
      -0.13450142741203308,
      -0.3073260486125946,
      -0.15199440717697144,
      -0.06535257399082184,
      0.02075939252972603
    ]
  ]
}

[编辑以反映comment]

如果您也想利用分数,请让jq 处理它。例如:

... | sed -n "2{s/'/\"/g;p;q}" | jq -s '{score:first,status:last}'
{
  "score": 0.548,
  "status": {
    "lstm_1": [
      [
        -0.13450142741203308,
        -0.3073260486125946,
        -0.15199440717697144,
        -0.06535257399082184,
        -0.1413831114768982
      ]
    ],
    "lstm_2": [
      [
        -0.13450142741203308,
        -0.3073260486125946,
        -0.15199440717697144,
        -0.06535257399082184,
        0.02075939252972603
      ]
    ]
  }
}

[编辑以反映 OP 的变化]

由于更改仅影响名称和值而不影响结构,因此迄今为止有效的方法仍然有效:

... | sed -n "2{s/'/\"/g;p;q}" | jq -s '{val:first,hs:last}'
{
  "val": 0.5,
  "hs": {
    "hs_1": [
      [
        -0.134501,
        -0.307326,
        -0.151994,
        -0.065352,
        -0.14138
      ]
    ],
    "hs_2": [
      [
        -0.134501,
        -0.307326,
        -0.151994,
        -0.065352,
        0.020759
      ]
    ]
  }
}

【讨论】:

  • 嗯可能是。但以类似的方式也应该得到分数。
  • 然后让jq 处理这些列。查看我的编辑。
  • 更改了问题以反映问题。你也可以编辑你的答案吗?
  • 根据revision history,您将表列标题从SCORESTATES 更改为VALHS,(据称)JSON 的字段名称来自lstm_1 和@987654347 @ 到 hs_1hs_2,以及实际数值。然而,在结构上,一切都没有改变。您仍然需要解析同一张表,并且第二列的数据仍然缺少正确的 JSON 引用。我无法帮助您让 Google API 提供正确的 JSON,但我可以(并且确实)帮助您解析收到的内容,这在结构上与您编辑之前相同。
猜你喜欢
  • 1970-01-01
  • 2013-04-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多