[英]Data entry using com.google.gson
我正在尝试创建一个Gson对象,其中将包含不同的类别和条目,这是我尝试执行的示例:
JsonObject jo = new JsonObject();
JsonArray ja = new JsonArray();
JsonObject mainObj = new JsonObject();
jo.addProperty("firstName", "John");
jo.addProperty("lastName", "Doe");
ja.add(jo);
mainObj.add("employees", ja);
jo = new JsonObject();
ja = new JsonArray();
jo.addProperty("firstName", "jean");
jo.addProperty("lastName", "dorian");
ja.add(jo);
mainObj.add("employees", ja);
jo = new JsonObject();
ja = new JsonArray();
jo.addProperty("firstName", "toto");
jo.addProperty("lastName", "tata");
ja.add(jo);
mainObj.add("manager", ja);
问题是您可以看到我每次必须创建一个新的JSonObject和Array时,我认为这不是最佳实践,而且“员工”中的旧值也被第二个替换。 有人可以帮我吗?
溴
杰里米
我每次都必须创建一个新的JSonObject和Array,我认为这不是最佳实践
我认为这样做是完全可以的。
而且“员工”中的旧值也被第二个值所取代
问题是您想在JsonObject
两次添加一个映射"employees" -> JsonArray
。 尽管在线JSON解析器(例如JSONLint)对此没有说明,但实际上不建议在JsonObject
两个相同的键。
RFC 7159第4章对此进行了解释:
从名称接收到的所有软件实现都将在名称-值映射上达成一致的意义上来说,名称都是唯一的对象是可以互操作的。 如果对象中的名称不是唯一的,则接收到该对象的软件的行为是不可预测的。 许多实现仅报告姓/值对。 其他实现报告错误或无法解析对象,某些实现报告所有名称/值对,包括重复项。
在LinkedTreeMap
, JsonObject
结构通过LinkedTreeMap
实现以保存映射。 添加新映射时, put
调用put
方法,该方法将删除以前的映射值(如果有)。
90 @Override public V put(K key, V value) {
91 if (key == null) {
92 throw new NullPointerException("key == null");
93 }
94 Node<K, V> created = find(key, true);
95 V result = created.value;
96 created.value = value;
97 return result;
98 }
如果要向该数组添加另一个Employee
,则不应将其直接添加到JsonObject
并创建一个新的JsonArray
。
JsonObject jo = new JsonObject();
JsonArray ja = new JsonArray();
JsonObject mainObj = new JsonObject();
jo.addProperty("firstName", "John");
jo.addProperty("lastName", "Doe");
ja.add(jo);
//remove this line
mainObj.add("employees", ja);
jo = new JsonObject();
//and remove this line
ja = new JsonArray();
jo.addProperty("firstName", "jean");
jo.addProperty("lastName", "dorian");
ja.add(jo);
mainObj.add("employees", ja);
jo = new JsonObject();
ja = new JsonArray();
jo.addProperty("firstName", "toto");
jo.addProperty("lastName", "tata");
ja.add(jo);
mainObj.add("manager", ja);
这将导致:
{
"employees": [
{
"firstName": "John",
"lastName": "Doe"
},
{
"firstName": "jean",
"lastName": "dorian"
}
],
"manager": [
{
"firstName": "toto",
"lastName": "tata"
}
]
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.