如何在结构不同时将JSON字符串转换为JAVA对象

我正在尝试从json字符串创建一个对象的实例。 这是我的目标:

public class Person { String name; String address; } 

这是我的转换器:

 Gson gson = new Gson(); Person p = gson.fromJson(str, Person.class); 

问题是我的输入字符串格式可能比我的Person对象更复杂,例如:

 { "name":"itay", "address":{ "street":"my street", "number":"10" } } 

或者address的值可以是一个简单的字符串(在这种情况下,我没有问题)。 我希望p.address包含json对象作为字符串。 这只是我问题的一个例子,事实上,“地址”要复杂得多,结构也是未知的。

我的解决方案是将Person类更改为:

 public class BetterPerson { String name; Object address; } 

现在, address是一个对象,我可以使用.toString()来获取值。

有更好的方法吗?

您可以尝试使用JsonDeserializer根据在运行时确定的JSON结构对其进行反序列化。

有关更多信息,请查看GSON Deserialiser示例

示例代码:

 class Person { private String name; private Object address; // getter & setter } class Address { private String street; private String number; // getter & setter } ... class PersonDeserializer implements JsonDeserializer { @Override public Person deserialize(final JsonElement json, final Type typeOfT, final JsonDeserializationContext context) throws JsonParseException { JsonObject jsonObject = json.getAsJsonObject(); Person person = new Person(); person.setName(jsonObject.get("name").getAsString()); JsonElement jsonElement = jsonObject.get("address"); if (!jsonElement.isJsonObject()) { String address = jsonElement.getAsString(); person.setAddress(address); } else { JsonObject addressJsonObject = (JsonObject) jsonElement; Address address = new Address(); address.setNumber(addressJsonObject.get("number").getAsString()); address.setStreet(addressJsonObject.get("street").getAsString()); person.setAddress(address); } return person; } } Person data = new GsonBuilder() .registerTypeAdapter(Person.class, new PersonDeserializer()).create() .fromJson(jsonString, Person.class); if (data.getAddress() instanceof Address) { Address address = (Address) data.getAddress(); } else { String address = (String) data.getAddress(); } 

您可以尝试使用HashMap address而不使用额外的Address POJO类,如果它的结构也未知。

你可以这样做,如果地址是String然后构造Address对象并在街道变量中设置地址字符串,如下图所示:

 class Person { private String name; private Address address; // getter & setter } ... JsonElement jsonElement = jsonObject.get("address"); if (!jsonElement.isJsonObject()) { String address = jsonElement.getAsString(); Address obj = new Address(); obj.setStreet(address); person.setAddress(obj); }else{...}