如何在结构不同时将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
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{...}