elasticsearch,cassandra,posix,jq,Json,elasticsearch,Cassandra,Posix,Jq" /> elasticsearch,cassandra,posix,jq,Json,elasticsearch,Cassandra,Posix,Jq" />

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

如何在bash中将JSON子元素字符串转换为真正的JSON元素,json,elasticsearch,cassandra,posix,jq,Json,elasticsearch,Cassandra,Posix,Jq,我有从Cassandra导出的JSON消息,我想将其作为结构化文档加载到Elastic中: { "correlationId": "fb8f855a0eac8985d430896d", "leg": 65535, "tag": "circuitpath", "offset": 479306, "len": 508, "prev": { "page": { "file": 10342, "page": 8 }, "record

我有从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 }  ] } ]"
}
但我不知道如何简单地将“数据”内容转换为允许将其加载到弹性文件中的格式

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

json2="${json//\\\"/\"}"
json2="${json2//\\\\/\\}"
echo "$json2"
“数据”元素看起来像:

"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 } ] } ]"
但是loader告诉我

“状态”:400,“错误”:{“类型”:“映射程序解析异常”,“原因”:“失败” 到 解析“,”原因“:{”类型“:”json解析“,”异常“,”原因“:”意外 字符('p'(代码112)):应使用逗号分隔对象 \n在[源: org.elasticsearch.common.io.stream。InputStreamStreamInput@3508edee; 行:1,列:170

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


知道如何将其转换为Elastic吗?

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

如果您愿意接受python:

  • 写入文件,比如
    record.json
    (为了方便起见,您也可以使用stdin)
  • python(替换文件名或使用sys.stdin和sys.stdout)


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

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

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

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

    .data |= (fromjson? // .)