How to convert JSON string to a JAVA object when the structure is different

前端 未结 1 750
野趣味
野趣味 2020-12-07 05:31

I\'m trying to create an instance of an object from a json string. This is my object:

public class Person {
    String name;
    String address;
}

相关标签:
1条回答
  • 2020-12-07 06:20

    You can try with JsonDeserializer to deserializer it as per JSON structure that is determined at run-time.

    For more info have a look at GSON Deserialiser Example

    Sample code:

    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();
    }
    

    You can try HashMap<String,String> address without using extra Address POJO class as well if it's structure is also not known.

    you can do in this way as well where if address is String then construct Address object and set the address string in street variable as illustrated below:

    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{...}
    
    0 讨论(0)
提交回复
热议问题