我使用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;
}
答案 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);
诀窍是使用子类来避免无限循环。