我是从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中减少这种麻烦?
使用像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
如果您要将其用于许多不同类型的对象,我建议使用反射而不是手动序列化每个对象。通过使用反射,您不需要创建像 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)
| 归档时间: |
|
| 查看次数: |
5001 次 |
| 最近记录: |