2013-12-11 10 views
11

Mam obiekt String zawierający dowolny dowolny json. Chcę owinąć go wewnątrz innego obiektu json, podobnie jak to:Dodawanie istniejącego łańcucha json z Gsonem

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

Jak mogę dodać moje niezawodnie json ciąg jako atrybut do niego bez konieczności budowania go ręcznie (tj unikając żmudnego ciąg konkatenacji)?

class Wrapper { 
    int version = 1; 
} 

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

Zauważ, że dodany json powinny nie być uciekł, ale być częścią owijki jako ważnego podmiotu json, podobnie jak to:

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

podane

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

Czy próbowałeś dodać pole "content" String? Jestem ciekaw zobaczyć wynik. – everton

+0

Prawdopodobnie zawartość zostanie usunięta. –

+0

Czy rozwiązałeś swój problem? – giampaolo

Odpowiedz

5

To jest moje rozwiązanie:

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

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

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

gdzie zmieniłem swoją klasę Wrapper w:

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

Można również napisać niestandardowe serializatora dla Wrapper jeśli chcesz ukryć szczegóły deserializacji/serializacji.

2

Będziesz musiał najpierw przekształcić go w deserializację, a następnie dodać do swojej struktury i ponownie szeregować całość. W przeciwnym razie opakowanie będzie zawierało owinięty JSON w całkowicie unikniętym łańcuchu.

to zakładając, że masz następujące w ciąg:

{"foo": "bar"} 

i chcą to zawinięte w obiekcie Wrapper, w wyniku JSON, który wygląda tak:

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

Jeśli tak nie deserializacji w pierwszej kolejności, spowoduje następujące:

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

Nie, nie będziesz musiał. Możesz użyć pośrednika 'JsonObject', który używa' LinkedTreeMap' poniżej. –

+0

@SotiriosDelimanolis: Nie sądzę, że robi to, co myślę, że OP próbuje osiągnąć.Poprawiłem moją odpowiedź, aby moje intencje były bardziej oczywiste. – jwueller

5

Proste, co nvert bean do JsonObject i dodaj właściwość.

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

drukuje

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

Czy to działa, jeśli '' arbitrary_json_string "' jest obiektem JSON * *? –

+1

@LutzHorn Możesz użyć 'JsonObject # add (JsonElement)' do tego. –

1

Jeśli nie dbam o całej strukturze JSON, nie trzeba korzystać z opakowania. Możesz deserializować go do ogólnego obiektu json, a także dodać nowe elementy po tym.

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

Dla tych, którzy wybierają się na ten temat, należy rozważyć this.

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