使用com.google.gson输入数据

时间:2015-07-26 15:08:38

标签: java 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,我认为这不是最佳实践,而且“雇员”中的旧值正在被第二个替换。 有人可以帮我这个吗?

BR,

热雷米

1 个答案:

答案 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"
    }
  ]
}