So setzen Sie ein JSON-Objekt mit einem Array mithilfe von Curl


94

Ich muss eine Reihe von Daten in die Datenbank eingeben. Die Benutzeroberfläche zur Eingabe der Daten ist nicht für die Masseneingabe geeignet, daher versuche ich, ein Befehlszeilenäquivalent zu formulieren. Wenn ich die Netzwerkanforderung der Benutzeroberfläche in Chrome untersuche, wird eine PUT-Anforderung eines JSON-Objekts angezeigt. Wenn ich versuche, die Anfrage zu replizieren

curl -H 'Accept: application/json' -X PUT '{"tags":["tag1","tag2"],"question":"Which band?","answers":[{"id":"a0","answer":"Answer1"},{"id":"a1","answer":"answer2"}]}' http://example.com/service`

Ich bekomme eine Fehlermeldung

Curl: (3) [Globbing] verschachtelte Klammern werden an Position X nicht unterstützt

Wobei X die Zeichenposition des ersten "[" ist.

Wie kann ich ein JSON-Objekt mit einem Array platzieren?

Antworten:


147

In Ihrer Befehlszeile sollten -d / - Daten vor der Zeichenfolge eingefügt sein, die Sie im PUT senden möchten, und Sie möchten den Inhaltstyp festlegen und nicht Akzeptieren.

curl -H 'Content-Type: application/json' -X PUT -d '[JSON]' http://example.com/service

Unter Verwendung der genauen JSON-Daten aus der Frage würde die vollständige Befehlszeile wie folgt lauten:

curl -H 'Content-Type: application/json' -X PUT \
-d '{"tags":["tag1","tag2"],"question":"Which band?","answers":[{"id":"a0","answer":"Answer1"},{"id":"a1","answer":"answer2"}]}' \
http://example.com/service

4
-1, da Content-Type (anstelle von Accept) der Header ist, der in diesem Fall festgelegt werden soll.
Goran

3
Für diejenigen, die sich fragen, ist [JSON] einfach ein Platzhalter für die JSON-Zeichenfolge. Fügen Sie Ihrer JSON-Zeichenfolge keine zusätzlichen eckigen Klammern hinzu.
Mihai Todor

89

Obwohl der ursprüngliche Beitrag andere Probleme hatte (dh das fehlende "-d"), ist die Fehlermeldung allgemeiner.

Curl: (3) [Globbing] verschachtelte Klammern werden an Position X nicht unterstützt

Dies liegt daran, dass geschweifte Klammern {} und eckige Klammern [] spezielle Globbing-Zeichen in Curl sind. Verwenden Sie die Option " -g ", um dieses Globbing auszuschalten .

Beispielsweise schlägt die folgende Solr-Facettenabfrage fehl, ohne dass "-g" das Curl-Globbing deaktiviert : curl -g 'http://localhost:8983/solr/query?json.facet={x:{terms:"myfield"}}'


3
Dies war die richtige Lösung für mich, mit -gwie erwartet gearbeitet. Danke @Yonik
Arjones

2
Meine Güte, ich habe nach einer Lösung für mein GraphQL-Curl-Problem gesucht und dies hat mir geholfen. Großartige Soße.
NetOperator Wibby

39

Es sollte erwähnt werden, dass der AcceptHeader dem Server etwas darüber sagt, was wir zurücknehmen, während der relevante Header in diesem Zusammenhang istContent-Type

Es ist oft ratsam anzugeben, Content-Typewie application/jsonbeim Senden von JSON. Für Curl lautet die Syntax:

-H 'Content-Type: application/json'

Der vollständige Curl-Befehl lautet also:

curl -H 'Content-Type: application/json' -H 'Accept: application/json' -X PUT -d '{"tags":["tag1","tag2"],"question":"Which band?","answers":[{"id":"a0","answer":"Answer1"},{"id":"a1","answer":"answer2"}]}' http://example.com/service`

2

Versuchen Sie, ein einfaches Anführungszeichen anstelle von doppelten Anführungszeichen zusammen mit -g zu verwenden

Das folgende Szenario hat bei mir funktioniert

curl -g -d '{"collection":[{"NumberOfParcels":1,"Weight":1,"Length":1,"Width":1,"Height":1}]}" -H "Accept: application/json" -H "Content-Type: application/json" --user test@testmail.com:123456 -X POST  https://yoururl.com

MIT

curl -g -d "{'collection':[{'NumberOfParcels':1,'Weight':1,'Length':1,'Width':1,'Height':1}]}" -H "Accept: application/json" -H "Content-Type: application/json" --user test@testmail.com:123456 -X POST  https://yoururl.com

Dies hat insbesondere meinen Fehler beim Curl-Befehl behoben : Ein falscher URL-Doppelpunkt ist das erste Zeichen


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.