Suchen Json-Pfad/(eine API) zur Aktualisierung der Wert in der gegebenen json-string in Java
Inshort : ich versuche zu finden, einige api, die könnte sich nur ändern Sie den Wert, indem Sie den ersten parameter als jsonString , der zweite parameter als JSONPath und drittens wird der neue Wert des Parameters. Aber alles was ich fand ist das..
https://code.google.com/p/json-path/
Diese api ermöglicht es mir, diese zu finden Wert in JSON-String. Aber, ich bin nicht der Suche nach einfachen Weg, um den Wert zu aktualisieren der Schlüssel. Zum Beispiel, Hier ist ein Buch.json.
{
"store":{
"book":[
{
"category":"reference",
"author":"Nigel Rees",
"title":"Sayings of the Century",
"price":8.95
},
{
"category":"fiction",
"author":"Evelyn Waugh",
"title":"Sword of Honour",
"price":12.99,
"isbn":"0-553-21311-3"
}
],
"bicycle":{
"color":"red",
"price":19.95
}
}
}
Ich kann auf die Farbe des Fahrrades dies zu tun.
String bicycleColor = JsonPath.read(json, "$.store.bicycle.color");
Aber ich bin auf der Suche nach einer Methode, die in JsonPath oder andere api-einige Sache wie diese
JsonPath.changeNodeValue(json, "$.store.bicycle.color", "green");
String bicycleColor = JsonPath.read(json, "$.store.bicycle.color");
System.out.println(bicycleColor); //This should print "green" now.
Bin ich ohne diese Optionen,
- Erstellen Sie eine neue JSON-String.
- Erstellen Sie ein JSON-Objekt, um sich mit sich ändernden Wert und konvertieren es zurück zu jsonstring
Grund: ich habe etwa 500 verschiedene Anforderungen für verschiedene Arten von service, die Rückkehr verschiedene json-Struktur. Also, ich möchte nicht manuell erstellen möchten neue JSON-string immer. Weil, die IDs sind dynamisch im json-Struktur.
Jede Idee oder Richtung, wird sehr geschätzt.
Aktualisierung dieser Frage mit der folgenden Antwort.
- Kopieren MutableJson.java.
- Kopie dieser kleine Schnipsel und ändern, wie pro die Sie brauchen.
private static void updateJsonValue() { JSONParser parser = new JSONParser(); JSONObject jsonObject = new JSONObject(); FileReader reader = null; try { File jsonFile = new File("path to book.json"); reader = new FileReader(jsonFile); jsonObject = (JSONObject) parser.parse(reader); } catch (Exception ex) { System.out.println(ex.getLocalizedMessage()); } Map<String, Object> userData = null; try { userData = new ObjectMapper().readValue(jsonObject.toJSONString(), Map.class); } catch (IOException e) { //TODO Auto-generated catch block e.printStackTrace(); } MutableJson json = new MutableJson(userData); System.out.println("Before:\t" + json.map()); json.update("$.store.book[0].author", "jigish"); json.update("$.store.book[1].category", "action"); System.out.println("After:\t" + json.map().toString()); }
Verwenden diese Bibliotheken.
- import org.json.einfach.JSONObject;
- import org.json.einfach.parser.JSONParser;
- import org.codehaus.jackson.Karte.ObjectMapper;
update value of ... with ...
. [Zorba'] [3] sieht aus wie eine gute Umsetzung der JSONiq und es gibt ein [Java binding][4]. Ich habe noch nicht ausprobiert, es ist nur eine Idee, wenn es funktioniert poste ich die Antwort. [1]: jsoniq.org/docs/JSONiq-usecases/html-single/... [2]: w3.org/TR/xquery-update-10/#id-replacing-node-value [3]: zorba.io/home [4]: docs.zorba.io.s3-website-us-east-1.amazonaws.com/3.0.0/javaUm es klarzustellen: das, was Sie scheinen WIRKLICH wollen, zu tun ist ein json-template mit den meisten die gleichen Werte. In anderen Worten, Sie erhalten ein JSON-string, machen sich eine Veränderung an, und leitet es woanders. Richtig?
Dies ist, was ich versuche zu erreichen. Lesen json-string --> Lesen Sie eine beliebige Taste(z.B. Fahrrad-Farbe) --> aktualisieren, dass die Knoten(also Farbe ändern, Wert) --> modifizierte json-string Anfragen zu stellen. Hinweis: ich kann nicht json als Vorlage habe ich verschiedene json-Struktur für alle server-Anfragen. Ich habe zum generieren von json-string aus der java-Klasse, um eine Anfrage zu stellen. Ich kann immer manuell erstellen dieser json-string, aber es ist mehr Strecke für 500 verschiedene json-string Strukturen. Ich Schreibe automation framework testng,spring,java ohne Benutzeroberfläche zu automatisieren Sachen, wo ich arbeiten im json-Ebene.
So ist Ihre Struktur: Client - - - - json-request---> intermediate server (die Sie jetzt arbeiten) -----> final server?
Ja. das ist absolut richtig.
InformationsquelleAutor JLP | 2014-08-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Unter der Annahme, dass geparste JSON repräsentiert werden können in der Erinnerung als Anzeigen, können Sie bauen eine API ähnlich JsonPath, dass sieht aus wie:
Habe ich schnell eine Zusammenfassung von dirty-Implementierung für einfache bestimmte Pfade (keine Unterstützung für die Bedingungen und Platzhalter), die traverse json-Baum, E. g. $.store.name, $.store.Bücher[0].isbn. Hier ist es: MutableJson.java. Es benötigt auf jeden Fall eine Verbesserung, aber kann einen guten start.
Beispiel:
Einen JSON-string kann leicht untersucht und in einer Karte mit Jackson:
Aktualisiert den code für die Arbeit mit Listen anstelle von arrays, so dass Jackson analysiert werden kann JSON-string in eine Map.
Toll. Ich Schätze Ihre Lösung. Es ist so gemacht, wie ich wollte. Tausend Dank für deine Hilfe. Nur entfernt den Kommentaren zu vermeiden Verwechslungen.
InformationsquelleAutor Vlad
Die Sache ist, dass die Funktionalität, die Sie wollen, ist bereits eine nicht dokumentierte Funktion von JsonPath. Beispiel über Ihre json-Struktur:
JsonObject jsonObj = new GsonBuilder().create().toJsonTree(dc.json()).getAsJsonObject();
InformationsquelleAutor Homyk
Nur die Antwort für Leute, die Landung auf dieser Seite in Zukunft als Referenz.
Könnten Sie überlegen, ein Java-Implementierung von jsonpatch. RFC finden Sie hier
Können Sie die operation, die durchgeführt werden muss (ersetzen, hinzufügen....), json-Pfad, in dem es durchgeführt werden, und der Wert, der verwendet werden soll.
Wieder, wobei Beispiel aus dem RFC :
Zur Implementierung in Java, ich habe es nicht selbst, aber Sie können einen Versuch geben, um https://github.com/fge/json-patch
InformationsquelleAutor kunal
So, in Reihenfolge zu ändern einen Wert in eine JSon-Zeichenfolge, gibt es zwei Schritte:
Sie versuchen, zu optimieren, Schritt 2, aber verstehen, dass Sie nicht in der Lage sein, um zu vermeiden, Schritt 1. Blick auf die Json-path-source-code (die, wirklich, ist nur ein wrapper um Jackson), beachten Sie, dass es bietet eine vollständige Parsen der Json-string, bevor Sie in der Lage, spuckte das Lesen Wert. Es tut dies, analysiert jedes mal, wenn Sie anrufen
read()
, z.B. es wird nicht zwischengespeichert.Ich denke, diese Aufgabe ist konkret genug, dass du gehst zu haben, um es selbst schreiben. Hier ist, was ich tun würde:
String
Stücke, die Sie nicht erwarten, zu oft ändern.String
Stück, plus der Daten, die Sie erwarten, um zu ändernIch denke, dass der genaue Umfang des Problems ist ungewöhnlich genug, dass es ist unwahrscheinlich, dass eine Bibliothek existiert bereits. Wenn ein Programm erhält eine Json -
String
, die meisten der Zeit, was Sie will, ist die vollständig deserialisiert das Objekt - es ist ungewöhnlich, dass es braucht, um uns dieses Objekt auf, um woanders hin.Persönlich, ich mag Google Gson: code.google.com/p/google-gson ich würde entweder das, oder Jackson, beide sind weit besser als die anderen Optionen.
InformationsquelleAutor durron597