2013-12-11 19 views
11

Ich habe ein String-Objekt mit einigen beliebigen JSON. Ich will es in einem anderen JSON-Objekt wickeln, wie folgt aus:Hinzufügen einer vorhandenen JSON-Zeichenfolge mit Gson

{ 
    version: 1, 
    content: >>arbitrary_json_string_object<< 
} 

Wie kann ich sicher meine JSON-String als ein Attribut, um es hinzuzufügen, ohne sie manuell zu bauen (dh langweilig String-Verkettung zu vermeiden)?

class Wrapper { 
    int version = 1; 
} 

gson.toJson(new Wrapper()) 
// Then what? 

Beachten Sie, dass die zugegebene json sollte nicht entkommen, aber ein Teil der Hülle als gültige Json Einheit sein, wie folgt aus:

{ 
    version: 1, 
    content: ["the content", {name:"from the String"}, "object"] 
} 

gegeben

String arbitraryJson = "[\"the content\", {name:\"from the String\"}, \"object\"]"; 
+0

Haben Sie versucht, ein 'content' String-Feld hinzuzufügen? Ich bin gespannt auf das Ergebnis. – everton

+0

Wahrscheinlich wird der Inhalt maskiert. –

+0

Haben Sie Ihr Problem gelöst? – giampaolo

Antwort

5

Dies ist meine Lösung:

Gson gson = new Gson(); 
    Object object = gson.fromJson(arbitraryJson, Object.class); 

    Wrapper w = new Wrapper(); 
    w.content = object; 

    System.out.println(gson.toJson(w)); 

, wo ich Ihre Wrapper Klasse geändert:

// setter and getters omitted 
public class Wrapper { 
    public int version = 1; 
    public Object content; 
} 

Sie

auch eine benutzerdefinierte Serializer für Ihre Wrapper schreiben können, wenn Sie das ausblenden möchten Details zur Deserialisierung/Serialisierung.

2

Sie müssen es zuerst deserialisieren, dann fügen Sie es Ihrer Struktur hinzu und re-serialisieren das Ganze. Andernfalls enthält der Wrapper nur den umschlossenen JSON in einer vollständig gesperrten Zeichenfolge.

Dies wird vorausgesetzt, Sie folgendes in einem String haben: in Ihrem Wrapper Objekt

{"foo": "bar"} 

und wollen es eingewickelt, in einem JSON führt, die wie folgt aussieht:

{ 
    "version": 1, 
    "content": {"foo": "bar"} 
} 

Wenn ja nicht zuerst deserialisieren, würde dies zu folgendem führen:

{ 
    "version": 1, 
    "content": "{\"foo\": \"bar\"}" 
} 
+0

Nein, das müssen Sie nicht. Sie können den Vermittler 'JsonObject' verwenden, der darunter eine' LinkedTreeMap' verwendet. –

+0

@StiriosDelimanolis: Ich denke nicht, dass das, was ich denke, OP versucht zu erreichen.Ich habe meine Antwort bearbeitet, um meine Absichten deutlicher zu machen. – jwueller

5

Einfach, co Verwandeln Sie Ihre Bean in eine JsonObject und fügen Sie eine Eigenschaft hinzu.

Gson gson = new Gson(); 
JsonObject object = (JsonObject) gson.toJsonTree(new Wrapper()); 
object.addProperty("content", "arbitrary_json_string"); 
System.out.println(object); 

druckt

{"version":1,"content":"arbitrary_json_string"} 
+0

Funktioniert das, wenn '' arbitrary_json_string '' ein JSON * -Objekt * ist? –

+1

@LutzHorn Sie können 'JsonObject # add (JsonElement)' dafür verwenden. –

1

Wenn Sie sich über die ganze JSON Struktur sich nicht, Sie brauchen nicht einen Wrapper zu verwenden. Sie können es zu einem generischen JSON-Objekt deserialisieren und danach auch neue Elemente hinzufügen.

JsonParser parser = new JsonParser(); 
JsonObject obj = parser.parse(jsonStr).getAsJsonObject(); 
obj.get("version"); // Version field 
7

Für diejenigen, die sich mit diesem Thema beschäftigen, denken Sie an this.

A a = getYourAInstanceHere(); 
Gson gson = new Gson(); 
JsonElement jsonElement = gson.toJsonTree(a); 
jsonElement.getAsJsonObject().addProperty("url_to_user", url); 
return gson.toJson(jsonElement); 
Verwandte Themen