【问题标题】:Struggling to Map JSON payload to model class努力将 JSON 有效负载映射到模型类
【发布时间】:2020-06-23 16:07:54
【问题描述】:

我正在尝试将传入的 json 有效负载映射到我的模型类的数组列表。 我有一个解决方案,但它不直观。 我尝试这样做但得到编译错误-

        ObjectMapper mapper = new ObjectMapper();
        ArrayList<ModelClass> = mapper.readValue(items, RoleAttribute.class);

仅供参考,我正在尝试将此数据保存在 Mongo 集合中。

控制器-

@PostMapping(value="/resource", consumes="application/json")
    public Iterable<ModeClass> createResources(@RequestBody JSONObject requestBody ) throws JsonParseException, JsonMappingException, IOException {

        System.out.println(requestBody.getClass());
        return serviceImpl.saveResources(requestBody);
    }

模型类-

@Data
@AllArgsConstructor
@Document(collection="collection-name")
public
class ModelClass{

    @Field
    private String ID;

    @Field
    private String description;
}

有效载荷采用以下格式-

{
    "data": [
        {
            "ID": "1",
            "description": "desc1"
        },
        {
            "ID": "2",
            "description": "desc2"
        },
        {
            "ID": "3",
            "description": "desc3"
        },
        {
            "ID": "4",
            "description": "desc4"
        }
        ....

    ]
}

我知道我应该使用 jackson,但我似乎无法弄清楚这一点。我需要更改我的 POJO 吗?我需要创建自定义 Jackson 配置吗?

【问题讨论】:

  • 什么是有效载荷?在格式化代码和形成问题方面也做得很好。
  • payload 和 pojo 有什么共同点吗?
  • 有效载荷已经存在。让我解决我的问题
  • Spring 应该自动完成
  • @the.lotuseater 这些都是字面上的赞美,因为您是新用户,问题很好,代码格式也很好。哎呀。

标签: java json spring-boot jackson


【解决方案1】:

您可以使用 json 注释来做到这一点。我还注意到您的值在 json 中表示为 data,因此也需要注意。看下面的代码。这将解决您的问题。

import com.fasterxml.jackson.annotation.JsonProperty;

@Data
@AllArgsConstructor
@Document(collection="collection-name")
public class ModelClass{
    @Field
    @JsonProperty("ID")
    private String classID;

    @Field
    @JsonProperty("description")
    private String classDescription;

    public String getClassID() {
        return classID;
    }

    public void setClassID(String classID) {
        this.classID = classID;
    }

    public String getClassDescription() {
        return classDescription;
    }

    public void setClassDescription(String classDescription) {
        this.classDescription = classDescription;
    }
}

和包装数据类如下

class Data {
    ModelClass[] data;

    public ModelClass[] getData() {
        return data;
    }

    public void setData(ModelClass[] data) {
        this.data = data;
    }
}

和json转换代码如下

        ObjectMapper mapper = new ObjectMapper();
        // json is your incoming json as a string. You can put inputstream also
        Data values = mapper.readValue(json, Data.class);
        System.out.println(values.getData().length);
        System.out.println(values.getData()[0].getClassID());

【讨论】:

    【解决方案2】:

    您需要一个用于 data 字段的容器类,例如:

    @Data
    @Document(collection="collection-name")
    public class DataClass{
    
        private List<ModelClass> data;
    }
    

    通过 Jackson 进行操作应该是自动的,在控制器中:

    public Iterable<ModeClass> createResources(@RequestBody DataClass requestBody ) {
    

    【讨论】:

    • 这是完美的。我最初尝试这样做,但我创建了一个嵌套类,它搞砸了。
    猜你喜欢
    • 1970-01-01
    • 2019-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-19
    • 1970-01-01
    相关资源
    最近更新 更多