当前位置: 首页 > 知识库问答 >
问题:

想用arraylist把json字符串反序列化成java对象

彭鸿文
2023-03-14

java对象:MyObject有antherObject1的列表,antherObject1也有antherObject2的列表

class MyObject{

private String                  status;

private String                  message;

private List<AnotherObject1>            data;
public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public List<AnotherObject1> getData() {
        return data;
    }

    public void setData(List<AnotherObject1> data) {
        this.data = data;
        }
}

Class AnotherObject1{
private Integer                 group_id;

 private List<AnotherObject2>           anotherList;
public Integer getGroup_id() {
   return group_id;
}

public void setGroup_id(Integer group_id) {
   this.group_id = group_id;
}

public List<AnotherObject2> getAnotherList() {
  return smsList;
}

public void setAnotherList(List<AnotherObject2> anotherList) {
   this.anotherList = anotherList;
}

}

class AnotherObject2{
  private String                    customid;

    private String                  customid1   ;

    private Long                    mobile;

    private String                  status;

    private String                  country;

    public String getCustomid() {
        return customid;
    }

    public void setCustomid(String customid) {
        this.customid = customid;
    }

    public String getCustomid1() {
        return customid1;
    }

    public void setCustomid1(String customid1) {
        this.customid1 = customid1;
    }

    public Long getMobile() {
        return mobile;
    }

    public void setMobile(Long mobile) {
        this.mobile = mobile;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country;
    }


}

json字符串:这是我的JSON字符串,通过它我想使用对象映射器创建一个java对象

String response="{\"status\":\"OK\",\"data\":{\"group_id\":39545922,\"0\":{\"id\":\"39545922-1\",\"customid\":\"\",\"customid1\":\"\",\"customid2\":\"\",\"mobile\":\"910123456789\",\"status\":\"XYZ\",\"country\":\"IN\"}},\"message\":\"WE R Happy.\"}"

ObjectMapper代码//将字符串转换为响应对象

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
objectMapper.readValue(responseBody, MyObject.class);

例外:这里是例外

com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.util.ArrayList out of START_OBJECT token
 at [Source: {"status":"OK","data":{"group_id":39545922,"0":{"id":"39545922-1","customid":"","customid1":"","customid2":"","mobile":"910123456789","status":"GOOD","country":"IN"}},"message":"We R happy."}; line: 1, column: 15] (through reference chain: MyObject["data"])
    at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:148)
    at com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:854)
    at com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:850)
    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.handleNonArray(CollectionDeserializer.java:292)
    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:227)
    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:217)
    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:25)
    at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:520)
    at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:95)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:256)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:125)
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3702)
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2714)
    at abc.disp(RestClientImpl.java:210)
    at abc.disp(RestClientImpl.java:105)
    at Application.<init>(Application.java:42)
    at Application.main(Application.java:45)

请指导我如何使它成为可能。

共有3个答案

穆仲卿
2023-03-14

首先,正如纳文·拉马瓦特所说,你的代码是不可编译的。

  • 在类中,另一个对象 1 获取Sms列表应采用另一个对象 2,setSms 列表也应采用另一个对象 2 作为参数。
  • 在类“我的对象集”数据和“获取数据”应使用“另一个对象1”作为参数

第二,你的JSON字符串是无效的,应该是这样的:

{"status":"OK","data":[{"group_id":39545922,"smsList":[{"customid":"39545922-1","customid1":"","mobile":913456789,"status":"XYZ","country":"XYZ"}]}]}

这是我使用的代码:

MyObject.java:

    import java.util.List;

    class MyObject {

        private String status;

        private String message;

        private List<AnotherObject1> data;

        public String getStatus() {
            return status;
        }

        public void setStatus(String status) {
            this.status = status;
        }

        public String getMessage() {
            return message;
        }

        public void setMessage(String message) {
            this.message = message;
        }

        public List<AnotherObject1> getData() {
            return data;
        }

        public void setData(List<AnotherObject1> data) {
            this.data = data;
        }
    }

另一个对象1.java :

    import java.util.List;

    public class AnotherObject1 {
        private Integer group_id;

        private List<AnotherObject2> smsList;

        public Integer getGroup_id() {
            return group_id;
        }

        public void setGroup_id(Integer group_id) {
            this.group_id = group_id;
        }

        public List<AnotherObject2> getSmsList() {
            return smsList;
        }

        public void setSmsList(List<AnotherObject2> smsList) {
            this.smsList = smsList;
        }
    }

AnotherObject2.java:

    public class AnotherObject2 {

        private String customid;

        private String customid1;

        private Long mobile;

        private String status;

        private String country;

        public String getCustomid() {
            return customid;
        }

        public void setCustomid(String customid) {
            this.customid = customid;
        }

        public String getCustomid1() {
            return customid1;
        }

        public void setCustomid1(String customid1) {
            this.customid1 = customid1;
        }

        public Long getMobile() {
            return mobile;
        }

        public void setMobile(Long mobile) {
            this.mobile = mobile;
        }

        public String getStatus() {
            return status;
        }

        public void setStatus(String status) {
            this.status = status;
        }

        public String getCountry() {
            return country;
        }

        public void setCountry(String country) {
            this.country = country;
        }

    }

要获取JSON字符串:

    import org.json.JSONObject;
    import org.json.XML;

    import com.google.gson.Gson;

    MyObject myObj = new MyObject();
    ArrayList<AnotherObject2> smsList = new ArrayList<AnotherObject2>();
    ArrayList<AnotherObject1> data = new ArrayList<AnotherObject1>();
    AnotherObject1 ao1 = new AnotherObject1();
    ao1.setGroup_id(39545922);
    ao1.setSmsList(smsList);
    AnotherObject2 sms = new AnotherObject2();
    sms.setCountry("XYZ");
    sms.setCustomid("39545922-1");
    sms.setCustomid1("");
    sms.setMobile((long) 913456789);
    sms.setStatus("XYZ");
    smsList.add(sms);
    ao1.setSmsList(smsList);
    data.add(ao1);
    myObj.setStatus("OK");
    myObj.setData(data);
    // Build a JSON string to display
    Gson gson = new Gson();
    String jsonString = gson.toJson(myObj);
    System.out.println(jsonString);
    // Get an object from a JSON string
    MyObject myObject2 = gson.fromJson(jsonString, MyObject.class);
    // Display the new object
    System.out.println(gson.toJson(myObject2));
汪胡非
2023-03-14

问题很简单:您声称data应该变成JavaList;这要求它的JSON输入应该是JSON数组。但是JSON所拥有的是一个JSON对象。

因此,您要么需要更改POJO定义以期望与JSON对象(POJO或java.util.Map)兼容;或者JSON包含data的数组。

孟征
2023-03-14

您的代码本身是不可兼容的...

private List<AnotherObject1> data; // Your class member is list of AnotherObject1

下面是getter和setter中的SMSDTO列表

public List<SMSDTO> getData() {
    return data;
}
 类似资料:
  • 问题内容: 如何将上述字符串反序列化为java对象。 我正在使用的类是 问题答案: @基达 我假设您可以控制JSON输入字符串的创建方式。我认为JSON字符串格式不正确,无法对地图类型进行默认的GSON反序列化。 我已经修改了输入字符串供您考虑,这将导致非null的LocalLocationId 如果我对输入字符串的假设不正确,请发表评论。 编辑1:由于无法修改输入,请考虑编写自定义解串器。以下是

  • 问题内容: 我有一些具有各种属性的JSON,其中大多数是简单数据类型。但是,我在JSON中有一个属性,当我将其反序列化为C#类时,我只需要将其反序列化为字符串即可。 JSON示例: 除了将是有效的JSON对象外,“ json”对象没有任何设置结构。 因此,在上面的示例中,“ json”的值是一个JSON对象-但是当它反序列化时,我需要将它作为字符串。 因此,如果我的C#类是: 然后,如果我使用:

  • 我试图序列化一个对象数组,并将其写入一个名为address.ser的文件,然后从该文件中读取,反序列化对象数组并显示其属性。我尝试一次序列化整个arrayList(读取时在单个会话中反序列化它),也尝试一个接一个地序列化对象数组的每个对象(读取时一个接一个地反序列化它)。问题是,当从address.ser文件读回来时,我只得到最后一个被写入的对象的数据,而不是其他的。 以下是代码片段: 这是用于将

  • 问题内容: 我有这个字符串: 我正在反序列化对象: 该对象看起来像: 并尝试创建字典: 但得到。 可能是什么问题? 问题答案: 请参阅mridula的答案,了解为什么您会得到null。但是,如果您想直接将json字符串转换为字典,则可以尝试以下代码段。

  • 有没有一种方法可以正确地反序列化以双引号开头和结尾的JSON字符串? 数据以流的形式输入(来自AWS S3对象)。这是流的内容(注意开头和结尾的双引号字符): JsonSerializer似乎没有正确地反序列化它。但是,对于以下内容,其工作原理与预期一致: 以下是片段:

  • 问题内容: 我有以下字符串 我想反序列化一个类的对象 我正在使用python 2.6和2.7 问题答案: