【问题标题】:Deserializing JSON in Java using Jackson使用 Jackson 反序列化 Java 中的 JSON
【发布时间】:2026-02-09 11:05:02
【问题描述】:

我尝试反序列化以下 JSON 示例片段。

{
    "total": 2236,
    "issues": [{
        "id": "10142",
        "key": "ID-2",
        "fields": {
            "attachment": [{
                "id": "11132"
            }]
        }
    }]
}

我可以将数据反序列化到 id 和 key,但不能反序列化字段中的附件。我的附件类始终为空

这是我的代码。

Response.java

@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class Response {

    @JsonProperty
    private int total;

    @JsonProperty
    private List<Issue> issues; 
}

问题.java

@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class Issue {

    @JsonProperty
    private int id;

    @JsonProperty
    private String key;

    @JsonProperty
    private Fields fields;
}

Fields.java

@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class Fields {

    @JsonProperty
    private Attachments attachment;
}

附件.java

@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class Attachments {

    @JsonProperty
    private List<Attachment> attachment; 
}

附件.java

@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class Attachment {

    @JsonProperty
    private String id;
}

【问题讨论】:

    标签: java json jackson jackson-databind


    【解决方案1】:

    在您的 JSON 中,attachment 是一个数组,而不是一个对象。

    您不需要Attachments 类,只需这样修改Fields

    @Data
    @JsonIgnoreProperties(ignoreUnknown = true)
    public class Fields {
    
        @JsonProperty
        private List<Attachment> attachment;
    }
    

    【讨论】:

      【解决方案2】:

      将 Java 类中的每个变量视为对应于 JSON 中的一个属性。 “附件”不在 JSON 文件中。您应该能够删除它并更改 Fields 类中的变量定义。

      @Data
      @JsonIgnoreProperties(ignoreUnknown = true)
      public class Fields {
      
          @JsonProperty
          private List<Attachment> attachment;
      }
      

      【讨论】:

      • 根据 Arnaud 的评论,这似乎没有帮助。
      • 我已将 JSON 剪切并粘贴到文件 tmp.json 中,python -mjson.tool tmp,json 抱怨:期望 ':' 分隔符:第 5 行第 22 列(字符 71) - 啊,抱歉,我忘了修复向上排版引号。
      • 我用建议的代码创建了一个项目(应该归功于 Arnaud,我没有意识到我的代码是一样的),它似乎工作得很好。不知道你为什么建议它不起作用,@user2254180?
      • 我做的一件事是删除 @Data 注释,因为这似乎不是来自杰克逊?
      • 使用我和 Arnaud 建议的代码,你得到了同样的效果吗? (空值?)
      【解决方案3】:

      如果你不想改变类结构,你可以修改 JSON。 在attachment 中,您需要再次添加attachment。 JSON 如下所示。

      {
         "total":2233,
         "issues":[
            {
               "id":"13598",
               "key":"ID-2368",
               "fields":{
                  "attachment":{
                     "**attachment**":[
                        {
                           "id":"11122"
                        }
                     ]
                  }
               }
            }
         ]
      }
      

      【讨论】:

      • 很遗憾,不能修改源 JSON。