2015-02-09 14 views
13

Sto cercando di ricostruire un Object dai suoi campi (ottengo i campi come una JSONObject), qualcosa di simile:"nameValuePairs" chiave strano appaiono quando si utilizza GSON

JSONObject jObj = new JSONObject(); 

JSONObject jObj1 = new JSONObject(); 
JSONObject jObj2 = new JSONObject(); 

JSONObject jObj21 = new JSONObject(); 
JSONObject jObj22 = new JSONObject(); 

jObj1.put("jObj11", "value11"); 
jObj1.put("jObj12", "value12"); 


jObj21.put("jObj211", "value211"); // level 2 
jObj21.put("jObj212", "value212"); 
jObj21.put("jObj213", "value213"); 

jObj22.put("jObj221", "value221"); 
jObj22.put("jObj222", "value222"); 
jObj22.put("jObj223", "value223"); 

jObj2.put("jObj21", jObj21); // level 1 
jObj2.put("jObj22", jObj22); 

jObj.put("jObj1", jObj1); // level 0 
jObj.put("jObj2", jObj2); 

io uso quelle linee per ottenere JSON da un Obeject

GsonBuilder builder = new GsonBuilder(); 
Gson gSon = builder.create(); 
gSon.toJSon(jObj); 

il problema è quando ho analizzare il principale Object (jObj) con GSON, ho trovato una chiave in più di nome "nameValuePairs". Allora perché ho questa chiave?

Avviso:

  • se faccio: jObj.toString(); sul registro, scompaiono questa chiave.
  • In caso affermativo: jObj.opt("nameValuePairs"); ho Null come risultato (come se non esistesse una chiave denominata "nomeValuePairs").

Questo è il mio risultato attuale:

enter image description here

E questo è quello che si aspettano di avere:

enter image description here

ho trovato something similar to my problem, ma non aiuta.

C'è qualcuno che ha una soluzione/soluzione alternativa o può spiegarmi l'origine di questa chiave?

Grazie.

risposta

21

tenta di utilizzare GSON di JsonObject invece di JSONObject come questo:

JsonObject jObj = new JsonObject(); 

    JsonObject jObj1 = new JsonObject(); 
    JsonObject jObj2 = new JsonObject(); 

    JsonObject jObj21 = new JsonObject(); 
    JsonObject jObj22 = new JsonObject(); 

    jObj1.addProperty("jObj11", "value11"); 
    jObj1.addProperty("jObj12", "value12"); 


    jObj21.addProperty("jObj211", "value211"); // level 2 
    jObj21.addProperty("jObj212", "value212"); 
    jObj21.addProperty("jObj213", "value213"); 

    jObj22.addProperty("jObj221", "value221"); 
    jObj22.addProperty("jObj222", "value222"); 
    jObj22.addProperty("jObj223", "value223"); 

    jObj2.add("jObj21", jObj21); // level 1 
    jObj2.add("jObj22", jObj22); 

    jObj.add("jObj1", jObj1); // level 0 
    jObj.add("jObj2", jObj2); 

    String json = new Gson().toJson(jObj); 
+1

Sì ... funziona con 'JsonObject', molte grazie! – Rami

+0

Questi trucchi mi hanno aiutato molto –

6

GSON è uno strumento per la serializzazione POJO. Se stai creando JSONObject da solo, non è necessario per gSon.toJSon(jObj);, puoi semplicemente chiamare jObj.toString() per ottenere il risultato.

L'utilizzo corretto di GSON è la creazione di oggetti POJO per la struttura dei dati.

vostro oggetto principale sarebbe simile a questa:

public class jObj { 
    JObj11 jObj11; 
    JObj12 jObj12; 
} 

Dopo l'intera struttura è definita in questo modo è possibile utilizzare gSon.toJSon(jObj); serializzare a JSON senza alcun utilizzo di JSONObject. GSON lo attraverserà e produrrà la stringa JSON.

Nel proprio esempio, GSON tenta di serializzare la struttura interna dell'oggetto JSONObject Java, non la struttura JSON che rappresenta. Come puoi vedere, JSONObject utilizza nameValuePair per archiviarne il contenuto.

+0

. @ Atok jObj.toString() funziona per me come un fascino! –

+0

Perché è così che deve essere usato :) – atok

+0

soluzione perfetta –

0

Infine, ho trovato una soluzione per questo problema. Invece di salvare il mio JSONObject usando Gson, lo salverò semplicemente come stringa usando toString() e ricostruirò il JSONObject originale in seguito, avvolgendo la stringa salvata in JSONArray come nell'esempio seguente.

Nel mio caso non ho la possibilità di cambiare JSONObject in com.google.gson.JsonObject come suggerito nella risposta accettata perché la mia codifica del 90% è stata eseguita e un tale cambiamento avrebbe rovinato i miei giorni e le mie notti. Di seguito è riportato il pezzo di codice che ha funzionato per me:

Ad esempio, salvare JSONObject di preferenza condivisa (o DB) come questo:

public void saveJson(JSONObject reqJson) { 
    sharedPref.editor().put("savedjson_key",reqJson.toString()).apply(); 
} 

Poi, quando si vuole ricostruire il JSONObject originale:

public JSONObject getSavedJson() { 
    String reqJson=sharedPref.getString("savedjson_key"); 
    if (reqJson != null) { 
     try { 
      JSONArray arr = new JSONArray(("["+reqJson+"]").replaceAll("\\\\", "")); 
      return arr.getJSONObject(0); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 

    } 
    return null; 
} 
Problemi correlati