कैसे एम्बेडेड (उद्धृत) json स्ट्रिंग को json में कनवर्ट करें


22

मैं पार्सिंग जोंस के लिए "jq" से परिचित हूं।

मैं एक ऐसी सेवा के साथ काम करता हूं जो कि एक json प्रतिक्रिया पैदा करती है जहां गुणों में से एक स्वयं एक json स्ट्रिंग है। मैं उस उद्धृत मूल्य को एक वैध जौन स्ट्रिंग में कैसे परिवर्तित कर सकता हूं ताकि मैं इसे jq के साथ संसाधित कर सकूं?

उदाहरण के लिए, अगर मैं सिर्फ "jq" से सादे सुंदर मुद्रित जोंस को देखता हूं, तो यहां आउटपुट का एक छोटा अंश है:

"someJsonString": "{\"date\":\"2018-01-08\", ...

मैं उस संपत्ति का मूल्य प्राप्त करने के लिए jq का उपयोग कर सकता हूं, लेकिन मुझे "इसे हटाकर" द्वारा उद्धृत स्ट्रिंग को मान्य json में बदलने की आवश्यकता है।

मुझे लगता है कि मैं इसे sed में पाइप कर सकता हूं, उद्घाटन को हटाकर और दोहरे उद्धरण समाप्त कर सकता हूं, और सभी बैकस्लैश (" sed -e 's/^"//' -e 's/"$//' -e 's/\\//g'") को हटा सकता हूं । यह काम करने लगता है, लेकिन यह सबसे मजबूत समाधान की तरह प्रतीत नहीं होता है।

अपडेट :

मैं जो कर रहा हूं, उस पर थोड़ा स्पष्ट होने के लिए, यहां कुछ नमूने हैं जो दिखाते हैं कि मैंने क्या कोशिश की है:

% curl -s -q -L 'http://.../1524.json' | jq '.results[0].someJsonString' | jq .
"{\"date\":\"2018-01-08\",...
% echo $(curl -s -q -L 'http:/.../1524.json' | jq '.results[0].someJsonString') | jq .
"{\"date\":\"2018-01-08\",...

अपडेट :

यहाँ एक पूरी तरह से स्टैंडअलोन उदाहरण दिया गया है:

% cat stuff.json | jq .
{
  "stuff": "{\"date\":\"2018-01-08\"}"
}
% cat stuff.json | jq '.stuff'
"{\"date\":\"2018-01-08\"}"
% cat stuff.json | jq '.stuff' | jq .
"{\"date\":\"2018-01-08\"}"

अपडेट :

अगर मैंने वास्तविक jq अभिव्यक्ति के साथ उस अंतिम आउटपुट को संसाधित करने की कोशिश की, तो यह कुछ इस तरह करता है:

% cat stuff.json | jq '.stuff' | jq '.date'
assertion "cb == jq_util_input_next_input_cb" failed: file "/usr/src/ports/jq/jq-1.5-3.x86_64/src/jq-1.5/util.c", line 371, function: jq_util_input_get_position
Aborted (core dumped)

यदि आप स्ट्रिंग संपत्ति का सिर्फ मूल्य jqप्राप्त करने के लिए उपयोग करते हैं, तो क्या यह उसे वापस कर देता है? यदि ऐसा है, तो बस एक ताजा में पाइप करें । jq
डोपघोटी

नहीं, यह उसे वापस नहीं लौटाता है। यही तो बात है।
डेविड एम। कर्र

कैसे के बारे में echo $(jq statement here)?
डोपघोटी

नहीं, कोई बदलाव नहीं।
डेविड एम। कर्र

@ DavidM.Karr, ठीक है, यदि संभव हो तो - वास्तविक महत्वपूर्ण स्ट्रिंग और अंतिम परिणाम के साथ अपने इनपुट का विस्तार करें
RomanPerekhrest 21

जवाबों:


20

इसके लिए एक rawझंडा है

    -r      output raw strings, not JSON texts;

jq -rc .stuff stuff.json

उत्पादन

{"date":"2018-01-08"}

अंतर यह है कि रोमन के उत्तर के साथ, आपको मान्य JSON आउटपुट या त्रुटि संदेश प्राप्त करने की गारंटी दी जाती है यदि यह JSON मान्य नहीं है।
कुसलानंद

मान्य बिंदु, लेकिन अगर यह स्वचालन में उपयोग किया जा रहा है, तो मुझे लगता है कि यह अचानक असामान्य होगा जो कि वैध जेट आउटपुट नहीं है। सबसे सुविधाजनक रूप लगभग हर समय पूरी तरह से ठीक होगा। हालांकि, अधिक सटीक तरीकों के बारे में जानना अभी भी अच्छा है।
डेविड एम। कर्र

@ DavidM.Karr "असामान्य रूप से अचानक वैध जेनन आउटपुट नहीं है" हा! Riiiight। स्वचालन में त्रुटि? त्रुटियां कभी नहीं होंगी ! क्यों परेशान!
ब्रूनो ब्रोंस्की

इसके jqलिए आगे JSON प्रसंस्करण के लिए दूसरे को पाइपिंग की आवश्यकता होती है , जबकि रोमन के दृष्टिकोण से आप समान jqअभिव्यक्ति जारी रख सकते हैं ।
रमन

1
@ क्रिकेट_007: इसे jq 1.5 के साथ आज़माया, और यह पुष्टि करता है कि यह काम नहीं करता: jq -rc '.stuff.date'उत्पादन करता है jq: error (at <stdin>:0): Cannot index string with string "date"। हालाँकि: .stuff | fromjson | .dateठीक काम करता है
रमन

26

साथ jqके fromjsonसमारोह:

नमूना stuff.jsonसामग्री:

{
  "stuff": "{\"date\":\"2018-01-08\"}"
}

jq -c '.stuff | fromjson' stuff.json

उत्पादन:

{"date":"2018-01-08"}

यह अस्वाभाविक लगता है। बशर्ते वैकल्पिक उत्तर
क्रिकेट_007
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.