如何在bash中将JSON子元素字符串转换为真正的JSON元素

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在bash中将JSON子元素字符串转换为真正的JSON元素相关的知识,希望对你有一定的参考价值。

我有从Cassandra导出的JSON消息,我想将其加载到Elastic作为结构化文档:

{
  "correlationId": "fb8f855a0eac8985d430896d",
  "leg": 65535,
  "tag": "circuitpath",
  "offset": 479306,
  "len": 508,
  "prev": {
    "page": {
      "file": 10342,
      "page": 8
    },
    "record": 216
  },
  "data": "[ { "policy": "Health Check", "execTime": 0, "filters": [  { "espk": "DEFAULT_PRIMARY_VordelGateway_7.4.0:223", "name": "Set Message", "type": "ChangeMessageFilter", "class": "com.vordel.circuit.conversion.ChangeMessageFilter", "status": "Pass", "filterTime": 1518702587006, "execTime": 0 } , { "espk": "DEFAULT_PRIMARY_VordelGateway_7.4.0:222", "name": "Reflect", "type": "ReflectFilter", "class": "com.vordel.circuit.net.ReflectFilter", "status": "Pass", "filterTime": 1518702587006, "execTime": 0 }  ] } ]"
}

但我不知道如何简单地将“数据”内容转换为格式,以便将其加载到Elastic中。

我试过以下方法,其中$ json是上面的消息:

json2="${json//\"/"}"
json2="${json2//\\/\}"
echo "$json2"

那么“data”元素似乎是:

"data":"[ { "policy": "Health Check", "execTime": 0, "filters": [ { "espk": "DEFAULT_PRIMARY_VordelGateway_7.4.0:223", "name": "Set Message", "type": "ChangeMessageFilter", "class": "com.vordel.circuit.conversion.ChangeMessageFilter", "status": "Pass", "filterTime": 1518709297006, "execTime": 0 } , { "espk": "DEFAULT_PRIMARY_VordelGateway_7.4.0:222", "name": "Reflect", "type": "ReflectFilter", "class": "com.vordel.circuit.net.ReflectFilter", "status": "Pass", "filterTime": 1518709297006, "execTime": 0 } ] } ]"

但装载机告诉我

“status”:400,“error”:{“type”:“mapper_parsing_exception”,“reason”:“无法解析”,“caused_by”:{“type”:“json_parse_exception”,“reason”:“意外字符( 'p'(代码112)):期待逗号分隔OBJECT条目 n在[来源:org.elasticsearch.common.io.stream.InputStreamStreamInput@3508edee; line:1,column:170

好像第一个子子元素名称“policy”中的字母“p”有问题

知道怎么把它变成Elastic吗?

答案

要将.data元素从JSON字符串转换为JSON对象,可以使用过滤器:

.data |= fromjson

如果您只想提取.data元素并将其转换,您可以使用过滤器:

.data | fromjson

例如:jq -c '.data|fromjson' data.json

Supplemental question

如果不确定fromjson是否会成功,你可以使用成语:fromjson? // .,例如:

.data |= (fromjson? // .)
另一答案

虽然这是有效的JSON,但您可能需要解析对象的data元素。

如果你愿意接受python:

  1. 写一个文件,比如record.json(为方便起见,你也可以使用stdin)
  2. python(替换文件名或使用sys.stdin和sys.stdout) import json record = json.load(open('/path/to/record.json')) data = json.loads(record['data']) record['data'] = data json.dump(record, open("/path/to/result.json", "w"))

以上是关于如何在bash中将JSON子元素字符串转换为真正的JSON元素的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中将字符串数组转换为字符串类型,如将每个元素连接成一个字符串,并在字符串上使用子字符串?

在 bash 中将 CSV 转换为 JSON

如何在 Bash 中将字符串从大写转换为小写? [复制]

如何在 Next JS 应用程序中将字符串转换为 HTML 元素?

如何在 C# 中将 Xml 转换为 Json,反之亦然

如何在pyspark中将JSON字符串转换为JSON对象