我正在尝试创建一个包含不同类别和条目的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,我认为这不是最佳实践,而且“雇员”中的旧值正在被第二个替换。 有人可以帮我这个吗?
BR,
热雷米
答案 0 :(得分:0)
我每次都需要创建一个新的JSonObject和Array 相信不是最好的做法
我认为这样做完全没问题。
以及"员工中的旧价值"正在取代第二个
问题是您要在"employees" -> JsonArray
中添加两次映射JsonObject
。虽然在线JSON解析器(例如JSONLint)没有说明任何内容,但实际上不建议在JsonObject
中使用两个相同的密钥。
RFC 7159第4章:
对此进行了解释名称都是唯一的对象在某种意义上是可互操作的 接收该对象的所有软件实现都会同意 名称 - 值映射。当对象中的名称不是 独特的,接收这样一个对象的软件的行为是 不可预知的。许多实现报告姓氏/值对 只要。其他实现报告错误或无法解析 对象,以及一些实现报告所有名称/值对, 包括重复。
在幕后,使用JsonObject
实现LinkedTreeMap
结构以保存映射。添加新映射时,将调用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"
}
]
}