При использовании 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]()
Я нашел нечто похожее на мою проблему, но это не помогает.
Есть ли кто-нибудь, у кого есть решение/обходное решение или может объяснить мне происхождение этого ключа?
Спасибо.
Ответы
Ответ 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);
}