Java中JSON格式之间的映射

use*_*643 7 java json

我是从JavaScript/Ruby来到Java的.假设我有一个动物的以下JSON对象:

{
  name: {
    common: "Tiger",
    latin: "Panthera tigris"
  }
  legs: 4
}
Run Code Online (Sandbox Code Playgroud)

我正在处理许多动物API,我想将它们标准化为我自己的通用格式,例如:

{
  common_name: "Tiger",
  latin_name: "Panthera tigris",
  limbs: {
    legs: 4,
    arms: 0
  }
}
Run Code Online (Sandbox Code Playgroud)

比方说,JavaScript,这很简单:

normalizeAnimal = function(original){
  return {
    common_name: original.name.common,
    latin_name: original.name.latin,
    limbs: {
      legs: original.legs || 0,
      arms: original.arms || 0
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

但是在Java中呢?使用org.json中的JSONObject类,我可以继续这样做:

public JSONObject normalizeAnimal(JSONObject original) throws JSONException{
  JSONObject name = original.getJSONObject("name");
  JSONObject limbs = new JSONObject();
  JSONObject normalized = new JSONObject();
  normalized.put("name_name", name.get("common"));
  normalized.put("latin_name", name.get("latin"));
  try{
    limbs.put("legs", original.get("legs");
  }catch(e){
    limbs.put("legs", 0);
  };
  try{
    limbs.put("arms", original.get("arms");
  }catch(e){
    limbs.put("arms", 0);
  };
  normalized.put("limbs", limbs);
  return normalized;
}
Run Code Online (Sandbox Code Playgroud)

随着我正在处理的JSON对象变得越来越深,这变得更糟.除了所有这些,我正在处理动物对象的许多提供者,我最终会寻找一些简洁的配置格式来描述转换(比如,也许"common_name": "name.common", "limbs.legs": "legs").

我怎样才能在Java中减少这种麻烦?

Enr*_*man 6

使用像Gson或Jackson这样的库,并将JSON映射到Java对象.

所以你要像豆一样

public class JsonAnima {
    private JsonName name;
    private int legs; 
}
public class JsonName {
    private String commonName;
    private String latinName;
}
Run Code Online (Sandbox Code Playgroud)

这可以很容易地转换成任何类似的库(与杰克逊)

ObjectMapper mapper = new ObjectMapper();
JsonAnimal animal = mapper.readValue(jsonString, JsonAnimal.class);
Run Code Online (Sandbox Code Playgroud)

然后你可以创建一个"转换器"来将JsonAnimal映射到Animal类.

这可以是一种方法.:)


一些链接:

Gson:http://code.google.com/p/google-gson/

杰克逊:http://wiki.fasterxml.com/JacksonHome


Fil*_*ipe 1

如果您要将其用于许多不同类型的对象,我建议使用反射而不是手动序列化每个对象。通过使用反射,您不需要创建像 normalizeAnimal 这样的方法,您只需创建一个方法或一个类来序列化为 json 格式。

如果您搜索“mapping json java”,您会发现一些有用的参考。就像gson一样。这是他们网站上的一个示例:



    class BagOfPrimitives {
      private int value1 = 1;
      private String value2 = "abc";
      private transient int value3 = 3;
      BagOfPrimitives() {
        // no-args constructor
      }
    }

    //(Serialization)
    BagOfPrimitives obj = new BagOfPrimitives();
    Gson gson = new Gson();
    String json = gson.toJson(obj);  
    ///==> json is {"value1":1,"value2":"abc"}

    ///Note that you can not serialize objects with circular references since that will result in infinite recursion. 

    //(Deserialization)
    BagOfPrimitives obj2 = gson.fromJson(json, BagOfPrimitives.class);   
    //==> obj2 is just like obj

Run Code Online (Sandbox Code Playgroud)