如何将json对象作为元素添加到另一个json

时间:2017-10-12 15:04:36

标签: json bash shell

我用jq。

的脚本创建一个json对象
jq -n --arg date "$DATE" --arg script "$SCRIPT" --arg log_level "$LOG_LEVEL" --arg ppid "$PPID" --arg message "$MESSAGE" '{"t":$date, "service":$script, "level":$log_level, "pid":$ppid, "message":$message}'

变量log_level和消息由另一个脚本提供,并且在消息中可以存储普通字符串或json字符串。

示例Json字符串:

{"text":"value", "text2":"value2"}

如果提供了纯字符串,则输出:

{
  "t": "2017-10-12 16:52:26",
  "service": "import.sh",
  "level": "INFO",
  "pid": "23425",
  "message": "START"
}

如果提供了json对象,则输出:

{
    "t": "2017-10-12 17:01:16",
    "service": "import.sh",
    "level": "INFO",
    "pid": "13069",
    "message": "{\"text\":\"value\", \"text2\":\"value2\"}"
}

如果我提供json对象,我的期望是什么:

{
    "t": "2017-10-12 17:01:16",
    "service": "cis_import.sh",
    "level": "INFO",
    "pid": "13069",
    "message": {
        "text": "value",
        "text2": "value2"
    }
}

我是对的,jq为每个\添加"因为它会被添加到json对象中,就像它是一个简单的字符串一样吗?

我怎样才能得到我期望的json?

1 个答案:

答案 0 :(得分:0)

终于搞定了。感谢提示chepnerblusky

要验证$MESSAGE是否为json我使用jq -n $MESSAGEjq manual代替jq . /path/to/file.json

要使用上面提到的--argjson,如果$ MESSAGE是普通字符串",我会在$MESSAGE附近添加MESSAGE="\"$MESSAGE\""。我用DATE,SCRIPT,LOG_LEVEL,PPID也这样做。

创建json对象的命令如下所示:

jq -cn --argjson date "$DATE" --argjson script "$SCRIPT" --argjson log_level "$LOG_LEVEL" --argjson ppid "$PPID" --argjson message "$MESSAGE" '{"t":$date, "service":$script, "level":$log_level, "pid":$ppid, "message":$message}'