当前位置: 代码迷 >> java >> 使用com.google.gson进行数据输入
  详细解决方案

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

热度:27   发布时间:2023-07-17 20:19:44.0

我正在尝试创建一个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两个相同的键。

第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"
    }
  ]
}
  相关解决方案