我正在尝试从其字段重建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);
我使用这些行从Obeject
GsonBuilder builder = new GsonBuilder();
Gson gSon = builder.create();
gSon.toJSon(jObj);
问题是我用Gson解析主Object
(jObj)时,我找到了一个名为"nameValuePairs"
的额外键。那么为什么我拿到这把钥匙?
通知:
jObj.toString();
,此键将消失。jObj.opt("nameValuePairs");
我的结果是 Null (就像没有名为&#34的键; nameValuePairs")。这是我的实际结果:
这就是我期望的:
我找到了something similar to my problem,但它没有帮助。
是否有人有解决方案/解决方法或可以向我解释此密钥的来源?
感谢。
答案 0 :(得分:32)
尝试使用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);
答案 1 :(得分:6)
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使用nameValuePair来存储它的内容。
答案 2 :(得分: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());
答案 3 :(得分:0)
最后,我找到了解决这个问题的方法。我不是使用Gson保存我的JSONObject,而是使用toString()将其保存为字符串,然后通过将保存的字符串包装到JSONArray中来重建原始的JSONObject,如下例所示。
在我的情况下,我没有选择按照接受的答案中的建议将JSONObject更改为com.google.gson.JsonObject,因为我的90%编码完成了,这样的更改会破坏我的日日夜夜。以下是适合我的代码:
例如,将JSONObject保存到共享首选项(或DB),如下所示:
<script src="https://mbostock.github.io/d3/d3.js"></script>
<script src="https://rawgit.com/tsayen/dom-to-image/master/src/dom-to-image.js"></script>
<div>
Using dom-to-image.js transform anny given html to a image (svg - no quality loss)<br>
1. tansform html into svg<br>
2. drow svg inside hidden canvas<br>
3. export canvas jpg or png<br>
4. I you like donwload the thing<br>
</div>
<button id='downloadbody'>Download body</button>
<button id='downloadcircle'>Download Circle</button>
<button id='downloadtable'>Download Table</button>
<div id="circle">
</div>
<div id="table">
</div>
然后,当您想要重建原始JSONObject时:
public void saveJson(JSONObject reqJson) {
sharedPref.editor().put("savedjson_key",reqJson.toString()).apply();
}
答案 4 :(得分:0)
您可以使用以下解决方案:
//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);
}