如何使用可能是Java中的String或Object的属性解析JSON?

时间:2014-07-24 14:31:06

标签: java json

我使用mongodb和nodejs作为后端来提供API。 API服务器将以不同的格式响应相同的用户对象,例如:

// curl http://localhost/users/5382f2949a24ed95b44dc04f
{ id: "5382f2949a24ed95b44dc04f", "name": "jack", "group": "5382f2949a24ed95b44dc04d" }

// curl http://localhost/users/5382f2949a24ed95b44dc04f?populate=group
{ id: "5382f2949a24ed95b44dc04f", "name": "jack", "group": { "id": "5382f2949a24ed95b44dc04d", "name": "g1" } }

group可以是外键(字符串类型)或对象。

但是如何使用Gson(或其他JSON解析器)在Java中处理这两个样式的JSON字符串?

public class User {
    private String or Group group; // ???
    private String name;
}

5 个答案:

答案 0 :(得分:1)

如果您使用杰克逊,您可以这样做:

public class User {
  private Group group;
  private String name;
}

public class Group {
  private String id;
  private String name;

  @JsonCreator
  public static valueOf(String id) {return new Group(id);}

}

您也可以使用构造函数方法。

我认为它也适用于Gson,否则尝试构造函数方法(例如:一个默认构造函数,一个带String参数)。

答案 1 :(得分:0)

将其保留为对象。尝试

import com.google.gson.Gson;

class User {
    private Object group; 
    private String name;
    public Object getGroup() {
        return group;
    }
    public void setGroup(Object group) {
        this.group = group;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public String toString() {
        return "User [group=" + group + ", name=" + name + "]";
    }
}

public class Sample {
    public static void main(String[] args) throws Exception {
        String json1 = "{ id: \"5382f2949a24ed95b44dc04f\", \"name\": \"jack\", \"group\": \"5382f2949a24ed95b44dc04d\" }";
        String json2 = "{ id: \"5382f2949a24ed95b44dc04f\", \"name\": \"jack\", \"group\": { \"id\": \"5382f2949a24ed95b44dc04d\", \"name\": \"g1\" } }";
        Gson gson = new Gson();
        System.out.println(gson.fromJson(json1, User.class)); // Prints - User [group=5382f2949a24ed95b44dc04d, name=jack]
        System.out.println(gson.fromJson(json2, User.class)); // Prints - User [group={id=5382f2949a24ed95b44dc04d, name=g1}, name=jack]
    }

}

答案 2 :(得分:0)

您可以在组班中处理此问题:

public class User {
    private Group group;
    private String name;
}


public class Group {
    private String id;
    private String name;

    public Group(JSONObject obj){
        JSONObject grpObj = obj.optJSONObject("group");

        if(grpObj != null){
            id = grpObj.getString("id");
            name = grpObj.getString("name");
        }
        else{
            id = obj.getString("group");
            name = "";
        }
    }
}

答案 3 :(得分:0)

尝试optJSONObject(" group")和optString(" group")

User usr = new User();
JSONObject body = new JSONObject();
JSONObject objGroup = body.optJSONObject("group");
String strGroup = body.optString("group");

if(objGroup!=null)
    usr.setGroup(objGroup);
else if(strGroup!=null&& strGroup.length>0)
    usr.setName(strGroup);
else
    System.out.println("something wrong...")

答案 4 :(得分:0)

我喜欢@NoDataFound的答案。杰克逊太棒了。 但是由于jar文件的大小,我决定使用Gson(事实证明构建过程会压缩包。)

最后,我用一个技巧来做到这一点:

class GroupDeserializer implements JsonDeserializer<Group> {

    class GroupObject extends Group {

    }

    @Override
    public Group deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        if (json.isJsonPrimitive())
            return new Group(json.getAsString());
        if (json.isJsonObject())
            return context.deserialize(json, GroupObject.class); // Avoid infinite loop
        return null;
    }

}

class UserDeserializer implements JsonDeserializer<User> {

    class UserObject extends User {

    }

    @Override
    public User deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        if (json.isJsonPrimitive())
            return new User(json.getAsString());
        if (json.isJsonObject())
            return context.deserialize(json, UserObject.class); // Avoid infinite loop
        return null;
    }

}

GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(Group.class, new GroupDeserializer());
gsonBuilder.registerTypeAdapter(User.class, new UserDeserializer());
Gson gson = gsonBuilder.create();
User user1 = gson.fromJson("{ \"group\": { \"name\": \"g\", \"id\": \"2\" }, \"name\": \"ami\", \"id\": \"1\" }", User.class);
System.out.println(user1);
User user2 = gson.fromJson("{ \"group\": \"2\", \"name\": \"ami\", \"id\": \"1\" }", User.class);
System.out.println(user2);

诀窍是使用子类来避免无限循环。