2015-02-09 2 views
13

Ich versuche, eine Object von seinen Feldern neu zu erstellen (i erhalten die Felder als JSONObject), etwa so:Strange „nameValuePairs“ Taste angezeigt werden, wenn Gson mit

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); 

ich diese Zeilen Json bekommen von einem Obeject

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

das Problem ist, wenn ich die Haupt Object (jObj) mit Gson analysieren, i "nameValuePairs" einen zusätzlichen Schlüssel mit dem Namen gefunden. Also warum bekomme ich diesen Schlüssel?

Hinweis:

  • Wenn ich tun: jObj.toString(); auf Log, dieser Schlüssel verschwinden.
  • Wenn ich es tue: jObj.opt("nameValuePairs"); Ich habe Null als Ergebnis (wie es gibt keinen Schlüssel namens "nameValuePairs").

Das ist mein tatsächliches Ergebnis:

enter image description here

Und das ist, was ich erwarten:

enter image description here

Ich fand something similar to my problem, aber es hilft nicht.

Gibt es jemanden, der eine Lösung/Workaround hat oder mir den Ursprung dieses Schlüssels erklären kann?

Danke.

Antwort

21

Versuchen Gson der JsonObject statt JSONObject wie folgt zu verwenden:

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

Ja ... es funktioniert mit 'JsonObject', vielen Dank! – Rami

+0

Diese Tricks haben mir sehr geholfen –

6

GSON ist ein Werkzeug für die POJO-Serialisierung. Wenn Sie JSONObject selbst erstellen, brauchen Sie gSon.toJSon(jObj); nicht. Sie können einfach jObj.toString() aufrufen, um das Ergebnis zu erhalten.

Die richtige GSON-Verwendung wäre die Erstellung eines POJO-Objekts für Ihre Datenstruktur.

Ihr Wurzelobjekt würde wie folgt aussehen:

public class jObj { 
    JObj11 jObj11; 
    JObj12 jObj12; 
} 

Nachdem die gesamte Struktur auf diese Weise definiert man gSon.toJSon(jObj); serialisiert es zu JSON ohne Verwendung von JSONObject verwenden kann. GSON wird es durchqueren und die JSON-Zeichenfolge erzeugen.

In Ihrem Beispiel versucht GSON, die interne Struktur des JSONObject-Java-Objekts zu serialisieren, nicht die JSON-Struktur, die es darstellt. Wie Sie sehen können, verwendet JSONObject nameValuePair, um seinen Inhalt zu speichern.

+0

. @ Atok jObj.toString() Arbeit für mich wie ein Charme! –

+0

Weil das ist wie zu verwenden ist :) – atok

+0

perfekte Lösung –

0

Schließlich habe ich eine Lösung für dieses Problem gefunden. Anstatt mein JSONObject mit Gson zu speichern, speichere ich es einfach als String mit toString() und rekonstruiere das ursprüngliche JSONObject später, indem ich die gespeicherte Zeichenfolge wie im folgenden Beispiel in JSONArray umschließe.

In meinem Fall habe ich keine Wahl, JSONObject zu com.google.gson.JsonObject zu ändern, wie in der akzeptierten Antwort vorgeschlagen, weil meine 90% Codierung gemacht wurde und eine solche Änderung meine Tage und Nächte ruiniert hätte. Es folgt das Stück Code, der für mich gearbeitet:

Zum Beispiel speichern JSONObject auf gemeinsame Vorliebe für (oder DB) wie folgt aus:

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

Dann, wenn Sie das Original JSONObject neu erstellen möchten:

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; 
} 
Verwandte Themen