繁体   English   中英

使用com.google.gson进行数据输入

[英]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章对此进行了解释:

从名称接收到的所有软件实现都将在名称-值映射上达成一致的意义上来说,名称都是唯一的对象是可以互操作的。 如果对象中的名称不是唯一的,则接收到该对象的软件的行为是不可预测的。 许多实现仅报告姓/值对。 其他实现报告错误或无法解析对象,某些实现报告所有名称/值对,包括重复项。

LinkedTreeMapJsonObject结构通过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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM