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

I am trying to create an instance of an object from a json string. It is my goal:

public class Person {
    String name;
    String address;
}

and this is my converter:

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

The problem is that my input string format may be more complex than my Person object, for example:

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

Or the addressvalue could be a simple string (in this case, I have no problem). I want to p.addresscontain the json object as a string. This is just an example of my problem, because the "address" is much more complicated and the structure is unknown.

My solution changes the class Personto:

public class BetterPerson {
    String name;
    Object address;
}

Now addressthis is an object, and I can use .toString()to get the value.

Is there a better way to do this?

+1
1

JsonDeserializer JSON, .

. GSON

:

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, 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{...}
0

Source: https://habr.com/ru/post/1542870/


All Articles