Подтвердить что ты не робот

При использовании Gson появляется странное имя "nameValuePairs"

Я пытаюсь перестроить Object из его полей (я получаю поля как JSONObject), примерно так:

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

Я использую эти строки, чтобы получить Json из Obeject

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

Проблема заключается в том, когда я разбираю основной Object (jObj) с Gson, я нашел дополнительный ключ с именем "nameValuePairs". Так почему я получаю этот ключ?

Примечание

  • Если я делаю: jObj.toString(); в журнале, этот ключ исчезает.
  • Если я делаю: jObj.opt("nameValuePairs");, у меня есть Null как результат (например, нет ключа с именем "nameValuePairs" ).

Это мой фактический результат:

enter image description here

И вот что я ожидаю:

enter image description here

Я нашел нечто похожее на мою проблему, но это не помогает.

Есть ли кто-нибудь, у кого есть решение/обходное решение или может объяснить мне происхождение этого ключа?

Спасибо.

4b9b3361

Ответ 1

Попробуйте использовать Gson JsonObject вместо JsonObject следующим образом:

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

Ответ 2

GSON - это инструмент для сериализации POJO. Если вы сами создаете JSONObject, нет необходимости в gSon.toJSon(jObj);, вы можете просто вызвать jObj.toString(), чтобы получить результат.

Собственное использование GSON должно было бы создать объект POJO для вашей структуры данных.

Ваш корневой объект будет выглядеть так:

public class jObj {
    JObj11 jObj11;
    JObj12 jObj12;
}

После того, как вся структура определена таким образом, вы можете использовать gSon.toJSon(jObj); сериализовать ее в JSON без использования JSONObject. GSON будет пересекать его и производить строку JSON.

В вашем примере GSON пытается сериализовать внутреннюю структуру объекта JSONObject Java, а не структуру JSON, которую он представляет. Как вы можете видеть, JSONObject использует имяValuePair для хранения содержимого.

Ответ 3

У меня была такая же проблема, когда я хотел использовать Gson только для красивой печати. JsonObject работает нормально, но если вы все еще хотите использовать JSONObject вместо JsonObject, вы можете использовать его следующим образом:

public class JsonUtil {
    public static String toPrettyFormat(String jsonString)
    {
        JsonParser parser = new JsonParser();
        JsonObject json = parser.parse(jsonString).getAsJsonObject();

        Gson gson = new GsonBuilder().setPrettyPrinting().create();
        String prettyJson = gson.toJson(json);

        return prettyJson;
    }
}

и просто передайте JSONObject в виде строки так:

String prettyJson = JsonUtil.toPrettyFormat(jsonObject.toString());

Ответ 4

Наконец, я нашел решение этой проблемы. Вместо сохранения моего JSONObject с помощью Gson я просто сохраню его как строку, используя toString(), и перестроит исходный JSONObject позже, обернув сохраненную строку в JSONArray, как показано в следующем примере.

В моем случае у меня нет выбора изменить JSONObject на com.google.gson.JsonObject, как это было предложено в принятом ответе, потому что мой 90% -ный код был выполнен, и такое изменение разрушило бы мои дни и ночи. Ниже приведен фрагмент кода, который работал у меня:

Например, сохраните JSONObject для общих предпочтений (или БД) следующим образом:

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

Затем, когда вы хотите восстановить исходный JSONObject:

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

Ответ 5

Вы можете использовать это решение:

   //org.json.JSONObject 
   JSONObject jObj = new JSONObject();  

  //com.google.gson.JsonObject
  JsonObject jObj1 = new JsonObject();
  jObj1.addProperty("jObj11", "value11");

  JsonObject jObj2 = new JsonObject();
  jObj2.addProperty("jObj12", "value12");

  //JSONObject put(String name, Object value)
  jObj.put("jObj1", jObj1); 
  jObj.put("jObj2", jObj2);

  //Result
   objectToJson(toMap(jObj));

  public Map<String, Object> toMap(JSONObject content) {
        final Map<String, Object> map = new HashMap<>(content.length());
        for (final Iterator<String> iterator = content.keys(); iterator.hasNext(); )          {
            final String key = iterator.next();
            map.put(key, get(key));
        }
        return map;
    }


  public static <T> String objectToJson(T object) {
     Gson gson = new GsonBuilder().setPrettyPrinting().create();
     return gson.toJson(object);
  }