如何使用Jackson将JSON与嵌套数组扁平化?

k5ifujac  于 2023-01-27  发布在  其他
关注(0)|答案(1)|浏览(307)

我正在使用Jackson解析以下JSON:

{
    "AwardID": "1111111",
    "AwardTitle": "Test Title",
    "Effort": 
        "[
            {
                "PersonFirstName": "Jon",
                "PersonLastName": "Snow"
            }
        ]"
}

我想把它展平,以便在下面的类中使用:

public class Award {
    private String awardId;
    private String awardTitle;
    private String personFirstName;
    private String personLastName;
}

我尝试了以下方法,并获得了前两个值,但在尝试使用JsonUnwrapped时无法从Effort中获得值。我注意到它不适用于数组,但我正在尝试使用main方法中的objectMapper.configure(DeserializationFeature.UNWRAP_SINGLE_VALUE_ARRAYS,true)配置来获得值。

public class Award {
    @JsonProperty("AwardID")
    private String awardId;

    @JsonProperty("AwardTitle")
    private String awardTitle;

    @JsonUnwrapped
    private Effort effort;
}

public class Effort {
    private String personFirstName;
    private String personLastName;
}

请注意,此时我只期望API响应的Effort数组中有一个值。
接下来推荐尝试什么?谢谢!

atmip9wb

atmip9wb1#

最简单的方法是,如果您有一个JSON数组,那么就有一个List<Effort>
如果Effort始终有1个项,则返回的JSON不应将Effort作为JSON数组,而应作为JSON对象
但是如果你只能用代码来处理它,你可以得到这样的代码 (注意,在Effort中应该总是包含一个项,否则它会抛出Exception)

public class Award {
    @JsonProperty("AwardID")
    private String awardId;

    @JsonProperty("AwardTitle")
    private String awardTitle;

    @JsonProperty("Effort")
    private Effort effort;
}

public class Effort {
    @JsonProperty("PersonFirstName")
    private String personFirstName;

    @JsonProperty("PersonLastName")
    private String personLastName;
}

您的ObjectMapper也需要启用DeserializationFeature.UNWRAP_SINGLE_VALUE_ARRAYS

ObjectMapper mapper = new ObjectMapper();
mapper.enable(DeserializationFeature.UNWRAP_SINGLE_VALUE_ARRAYS);
Award award = mapper.readValue(rawJson, Award.class); // rawJson is your JSON String

并且它应该具有以下输出:

Award(awardId=1111111, awardTitle=Test Title, effort=Effort(personFirstName=Jon, personLastName=Snow))

注意,注解@JsonUnwrapped只能应用于JSON对象,而不能应用于JSON数组
值被序列化为JSON对象(无法使用此机制展开JSON数组)

相关问题