簡體   English   中英

結構不同時如何將JSON字符串轉換為JAVA對象

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM