JSON के मल्टीलाइन के साथ कर्ल


85

नीचे दिए गए कर्ल कमांड पर विचार करें, क्या JSON में नई लाइन की अनुमति देना संभव है (बिना minify के) और सीधे bash (Mac / Ubuntu) में निष्पादित करें

curl -0 -v -X POST http://www.example.com/api/users \
-H "Expect:" \
-H 'Content-Type: text/json; charset=utf-8' \
-d \
'
{
    "field1": "test",
    "field2": {
        "foo": "bar"
    }
}'

जब मैं ऊपर कमांड चलाता हूं, तो लगता है second { कि उपरोक्त कमांड को कैसे ठीक किया जाए?

अपडेट किया गया : वास्तव में मैं बिना किसी समस्या के पहले कमांड को चलाने में सक्षम था, निश्चित नहीं कि समस्या हाल ही में क्यों हुई।


1
क्या आप हमें त्रुटि के बारे में अधिक बता सकते हैं? आपका उदाहरण मेरे सिस्टम पर "जैसा है" काम करता है। mymac > bash --version GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin15) Copyright (C) 2007 Free Software Foundation, Inc.
एरिक बोलिंगर

हाँ, मेरे लिए भी काम करता है:GNU bash, version 4.3.42(1)-release
miken32

1
इसके अलावा बाहर की जाँच स्ट्रिंग वाक्य रचना एएनएसआई सी की तरह :echo $'here is a newline:\nand here is a tab:\t'
miken32

application/jsonJSON डेटा के लिए सही मीडिया प्रकार है
पॉकेटसैंड

जवाबों:


124

मुझे बैश मैन पेज में वर्णित "यहाँ दस्तावेज़" के साथ ऐसा करने का एक और तरीका याद आया और यहाँ विस्तृत है@-शरीर को STDIN से पढ़ने का मतलब है, जबकि << EOFस्क्रिप्ट सामग्री को "EOF" तक कर्ल करने के लिए STDIN के रूप में पाइप करना है। यह लेआउट अलग-अलग फ़ाइलों या "इको वैरिएबल" दृष्टिकोण का उपयोग करने से पढ़ने में आसान हो सकता है।

curl -0 -v -X POST http://www.example.com/api/users \
-H "Expect:" \
-H 'Content-Type: application/json; charset=utf-8' \
--data-binary @- << EOF
{
    "field1": "test",
    "field2": {
        "foo": "bar"
    }
}
EOF

नोट: उपयोग --trace <outfile>कर्ल विकल्प रिकॉर्ड करने के लिए वास्तव में क्या तार पर चला जाता है। किसी कारण के लिए, यह यहाँ दस्तावेज़ दृष्टिकोण newlines स्ट्रिप्स। (अपडेट: कर्ल-डी विकल्प द्वारा नई प्रतियां छीन ली गईं। सही किया गया!)


5
यह साफ है, कोई अतिरिक्त उद्धरण नहीं, कोई बच नहीं है और यह बहुत अच्छी तरह से काम करता है। धन्यवाद।
सेठ

क्या हम ऐसे सिंटैक्स के साथ पाइप का उपयोग कर सकते हैं?
इवान बालाशोव

2
हां, आप आउटपुट को किसी अन्य कमांड पर पाइप कर सकते हैं, हालांकि प्लेसमेंट मध्य में सही है। स्टड पुनर्निर्देशित करने के बाद स्टडआउट रीडायरेक्ट जोड़ें। शब्द गणना का उपयोग करने वाला उदाहरण:-d @- << EOF | wc
एरिक बोलिंजर

2
यह वह दस्तावेज़ नहीं है जो नई लाइनें स्ट्रिप्स करता है, लेकिन curl -dविकल्प: curl.haxx.se/docs/manpage.html#-d--data-binaryनईलाइन और गाड़ी वापसी वर्ण रखने के लिए उपयोग करें ।
dzieciou 12

39

मार्टिन को JSON को एक चर में रखने के सुझाव के तर्ज पर, आप JSON को एक अलग फ़ाइल में भी रख सकते हैं, और फिर -dकर्ल के सिंटैक्स का उपयोग करके फ़ाइल नाम की आपूर्ति कर सकते हैं:

curl -0 -v -X POST http://www.example.com/api/users \
  -H "Expect:" \
  -H 'Content-Type: text/json; charset=utf-8' \
  -d @myfile.json

नुकसान स्पष्ट है (2 या अधिक फाइलें जहां आपके पास एक हुआ करती थी।) लेकिन प्लस साइड पर, आपकी स्क्रिप्ट फ़ाइल नाम या निर्देशिका तर्क को स्वीकार कर सकती है और आपको इसे संपादित करने की आवश्यकता नहीं होगी, बस इसे अलग JSON फ़ाइलों पर चलाएं। क्या यह उपयोगी है कि आप क्या हासिल करने की कोशिश कर रहे हैं पर निर्भर करता है।


1
नोट: सुनिश्चित करें कि आपने jsonlint.com के
vikramvi

यह दृष्टिकोण दूसरों की तुलना में साफ और आसान डीबग करना है।
विक्रमवी

महान समाधान। पथ थ से सावधान!
पियरे फेरी

21

किसी कारण के लिए, यह यहाँ दस्तावेज़ दृष्टिकोण newlines स्ट्रिप्स

@ एरिक-बोलिंजर कारण हैरेडोक स्ट्रिप्स नईलाइन्स है क्योंकि आपको ईओएफ के हवाले से अपने हिरिडॉक को नईलाइन्स को संरक्षित करने के लिए बताने की आवश्यकता है:

curl -0 -v -X POST http://www.example.com/api/users \
-H "Expect:" \
-H 'Content-Type: text/json; charset=utf-8' \
-d @- <<'EOF'

{
    "field1": "test",
    "field2": {
        "foo": "bar"
    }
}
EOF

EOF के आसपास सिंगल-टिक्स को पहली बार परिभाषित करें, लेकिन दूसरा नहीं।


20

आपको बाहरी दोहरे उद्धरण चिह्नों का उपयोग करना चाहिए, और इस तरह से सभी आंतरिक उद्धरणों से बचना चाहिए:

curl -0 -v -X POST http://www.example.com/api/users \
-H "Expect:" \
-H 'Content-Type: text/json; charset=utf-8' \
-d \
"
{
    \"field1\": \"test\",
    \"field2\": {
        \"foo\": \"bar\"
    }
}"

19

आप अपने json को var में असाइन कर सकते हैं:

json='
{
    "field1": "test",
    "field2": {
        "foo": "bar"
    }
}'

अब आप इसका उपयोग कर कर्ल कर सकते हैं stdin:

echo $json | curl -0 -v -X POST http://www.example.com/api/users \
-H "Expect:" \
-H 'Content-Type: text/json; charset=utf-8' \
-d @-

ब्लॉक को घेरने के लिए सिंगल कोट्स का उपयोग करने का मतलब है कि आप JSON में वैरिएबल (जैसे ) का उपयोग नहीं कर सकते${username}
एयर

हाँ, लेकिन दोहरे उद्धरण चिह्नों का उपयोग करने का मतलब है कि आप अपने डेटा में $ संकेतों का उपयोग नहीं कर सकते। जो आपके लिए सही है उसे चुनें।
मार्टिन कोन्सेनी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.