首页 > 解决方案 > 无法使用 Gson 将 JSON 编组为复杂的 Java 类型

问题描述

我正在尝试使用 Gson 和 Java 1.8 将 JSON 有效负载编组为复杂的 Java 类型。

我用于 Gson 的依赖项:

<dependency>
    <groupId>com.squareup.retrofit2</groupId>
    <artifactId>converter-gson</artifactId>
    <version>2.4.0</version>
</dependency>

JSON 响应负载(我用来模拟我的 POJO)作为字符串输入:

{
    "header":{
        "timestamp":"1932264786"
    },
    "entity":[
        {
            "id":"1",
            "musician":{
                "genre":{
                    "type":"jazz"
                },
                "timestamp":"2593264786",
                "musician":{
                    "id":"23104"
                }
            }
        }
    ]
}

标头.java:

import lombok.Data;

@Data
public class Header {
    private String timestamp;
}

实体.java:

import lombok.Data;

@Data
public class Entity {

    private String id;

    @Data
    static class Musician {

        @Data
        static class Genre {
            private String type;
        }

        @Data
        class InnerMusician {
            private String id;
        }
    }
}

GsonObject.java(这是包含上述所有 POJO 的顶级类):

import lombok.Data;

import java.util.List;

@Data
public class GsonObject {
    private Header       header;
    private List<Entity> entities;
}

在我的调用类中,这是未填充的代码:

Gson gson = new Gson();
GsonObject gsonObject = gson.fromJson(json, (Type) GsonObject.class);

内部gsonObject标头类已正确填充时间戳,但List<GsonObject> entities为空。

我可能做错了什么?

标签: javajsongsonlombok

解决方案


正如@Savior 指出的那样,在 JSON 中,属性是entity,在你的类中是entities.

在您的类中使用@SerializedName将 java 属性映射到 JSON 属性。

@SerializedName("entity")
private List<Entity> entities;

推荐阅读