![](/img/trans.png)
[英]How to convert json string to java object, if json property name and java object property are different
[英]How to convert JSON string to a JAVA object when the structure is different
我正在嘗試從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<Person> {
@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<String,String> address
的結構,也可以使用它而不使用額外的Address
POJO類。
您也可以在地址為String的情況下構造地址對象,並在street變量中設置地址字符串,如下所示:
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{...}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.