当结构不同时如何将JSON字符串转换为JAVA对象 [英] How to convert JSON string to a JAVA object when the structure is different

查看:115
本文介绍了当结构不同时如何将JSON字符串转换为JAVA对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图从json字符串中创建一个对象的实例。
这是我的对象:

  public class Person {
String name;
字符串地址;
}

这是我的转换器:

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

问题是我的输入字符串格式可能比我的Person对象更复杂,例如:

  {
name:itay,
address:{
街道:我的街道,
号码:10
}
}

地址的值可以是一个简单的字符串(在这种情况下,我没有问题)。
我希望 p.address 包含json对象作为字符串。
这只是我的问题的一个例子,事实上,地址要复杂得多,而且结构也是未知的。



我的解决方案是更改 Person class to:

  public class BetterPerson {
String名称;
对象地址;

$ / code>

现在,地址是一个对象,我可以使用 .toString()来获取值。



有没有更好的方法这样做?

解决方案

您可以使用 JsonDeserializer 按照在运行时确定的JSON结构进行反序列化。



有关更多信息,请参阅 GSON反序列器示例 a>

示例代码:

  class Person {
私人字符串名称;
私有对象地址;
// getter& setter
}

class地址{
private String street;
私人字符串编号;
// getter& setter
}

...

类PersonDeserializer实现了JsonDeserializer< Person> {

@Override
public Person deserialize(final JsonElement json,final Type typeOfT,$ b $ 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.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<字符串,字符串>地址而不使用额外的地址 POJO类以及它的结构也是未知的。



<如果地址是String,那么你可以这样做,然后构造Address对象,并在街道变量中设置地址字符串,如下所示:

  class Person {
private String name;
私人地址;
// 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 {...}


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

and this is my converter:

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

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

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

Or address's value can be a simple string (in that case I have no problem). I want p.address to contain the json object as string. This is only an example of my problem, in fact, the "address" is much more complex and the structure is unknown.

My solution is changing the Person class to:

public class BetterPerson {
    String name;
    Object address;
}

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

Is there a better way of doing this?

解决方案

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

这篇关于当结构不同时如何将JSON字符串转换为JAVA对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆