我用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?
答案 0 :(得分:0)
要验证$MESSAGE
是否为json我使用jq -n $MESSAGE
请jq 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}'