2013-12-11 12 views
11

Ho un oggetto String contenente qualche json arbitrario. Voglio avvolgerla all'interno di un altro oggetto JSON, in questo modo:Aggiunta di una stringa JSON esistente con Gson

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

Come posso aggiungere il mio modo affidabile stringa JSON come un attributo ad esso senza dover costruire manualmente (ad esempio evitando noiose concatenazione di stringhe)?

class Wrapper { 
    int version = 1; 
} 

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

Si noti che il JSON aggiunto dovrebbe non essere sfuggito, ma un essere parte del involucro come entità JSON valida, in questo modo:

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

dato

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

Hai provato ad aggiungere un campo di stringa 'content'? Sono curioso di vedere il risultato. – everton

+0

Probabilmente il contenuto sarà sfuggito. –

+0

Hai risolto il tuo problema? – giampaolo

risposta

5

Questa è la mia soluzione:

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

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

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

dove ho cambiato la classe Wrapper in:

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

È possibile anche scrivere un serializzatore personalizzato per il vostro Wrapper se si desidera nascondere il dettagli della deserializzazione/serializzazione.

2

Prima dovrai deserializzare, quindi aggiungerlo alla tua struttura e ri-serializzare il tutto. Altrimenti, il wrapper conterrà semplicemente il JSON avvolto in una stringa completamente escape.

Ciò presuppone di avere quanto segue in una stringa:

{"foo": "bar"} 

e volete avvolto nel vostro Wrapper oggetto, risultando in un JSON che assomiglia a questo:

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

Se avete fatto non deserializzare prima, si otterrebbe quanto segue:

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

No, non sarà necessario. Puoi utilizzare l'intermediario 'JsonObject' che utilizza un' LinkedTreeMap' sotto. –

+0

@SotiriosDelimanolis: Non penso che faccia quello che penso che l'OP sta cercando di ottenere.Ho modificato la mia risposta per rendere le mie intenzioni più ovvie. – jwueller

5

Semplice, co convertire il bean in un JsonObject e aggiungere una proprietà.

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

stampe

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

Funziona se "arbitrary_json_string" 'è un oggetto JSON * *? –

+1

@LutzHorn È possibile utilizzare 'JsonObject # add (JsonElement)' per questo. –

1

Se non si preoccupano l'intera struttura JSON, non è necessario utilizzare un wrapper. È possibile deserializzare su un oggetto json generico e anche aggiungere nuovi elementi dopo.

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

Per coloro che si avventurano su questo argomento, considerare this.

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