【问题标题】:JSON parsing using jackson in spring?在春季使用杰克逊进行JSON解析?
【发布时间】:2022-08-16 23:28:08
【问题描述】:

我有以下 JSON

{
  \"ads\": [
    {
  \"228029_228029\": {
    \"ad_id\": \"228029\",
    \"duration\": 10,
    \"m3u8_text\": {
      \"_1280p\": \"#EXTM3U\\n#EXT-X-VERSION:3\\n#EXT-X-ALLOW-CACHE:YES\\n#EXT-X-TARGETDURATION:7\\n#EXT-X-MEDIA-SEQUENCE:0\\n#EXTINF:7.120000,\\n_1280p_0000.ts\\n#EXTINF:2.880000,\\n_1280p_0001.ts\\n#EXT-X-ENDLIST\\n\",
      \"_320p\": \"#EXTM3U\\n#EXT-X-VERSION:3\\n#EXT-X-ALLOW-CACHE:YES\\n#EXT-X-TARGETDURATION:7\\n#EXT-X-MEDIA-SEQUENCE:0\\n#EXTINF:7.120000,\\n_320p_0000.ts\\n#EXTINF:2.880000,\\n_320p_0001.ts\\n#EXT-X-ENDLIST\\n\"
    }
  }
},
{
  \"228845_228845\": {
    \"ad_id\": \"228845\",
    \"duration\": 24,
    \"m3u8_text\": {
      \"_1280p\": \"#EXTM3U\\n#EXT-X-VERSION:3\\n#EXT-X-ALLOW-CACHE:YES\\n#EXT-X-TARGETDURATION:8\\n#EXT-X-MEDIA-SEQUENCE:0\\n#EXTINF:7.840000,\\n_1280p_0000.ts\\n#EXTINF:6.880000,\\n_1280p_0001.ts\\n#EXTINF:6.680000,\\n_1280p_0002.ts\\n#EXTINF:2.600000,\\n_1280p_0003.ts\\n#EXT-X-ENDLIST\\n\",
      \"_320p\": \"#EXTM3U\\n#EXT-X-VERSION:3\\n#EXT-X-ALLOW-CACHE:YES\\n#EXT-X-TARGETDURATION:8\\n#EXT-X-MEDIA-SEQUENCE:0\\n#EXTINF:7.840000,\\n_320p_0000.ts\\n#EXTINF:6.880000,\\n_320p_0001.ts\\n#EXTINF:6.680000,\\n_320p_0002.ts\\n#EXTINF:2.600000,\\n_320p_0003.ts\\n#EXT-X-ENDLIST\\n\"
    }
  }
}
  ],
  \"total_duration\": 80
}

我已经创建了相应的模型类 这是根模型

@JsonIgnoreProperties(ignoreUnknown = true)
public class AdsResponse {
@JsonProperty(\"ads\")
List<Ad> ads;
@JsonProperty(\"total_duration\")
long totalDuration;
}

然后是广告模型

public class Ad {
Map<String,AdInfo> ad;}

然后是 AdInfo 模型

public class AdInfo {
@JsonProperty(\"m3u8_text\")
AdManifest adManifest;
int duration;
@JsonProperty(\"ad_id\")
String adId;}

然后是清单模型

public class AdManifest {
@JsonProperty(\"_1280p\")
String _1280p;
@JsonProperty(\"_320p\")
String _320p;}

当我尝试使用下面的代码解析它时

AdsResponse response = new ObjectMapper().readValue(
                res,
                AdsResponse.class);

我得到空的广告对象

AdsResponse{ads=[Ad{ad=null}, Ad{ad=null}, totalDuration=80}

这里有什么问题?

  • 您的 Ad 类似乎缺少正确的映射。它需要ad 属性出现在 JSON 中,但您的 JSON 表明嵌套地图的名称不应该存在。您可能需要使用@JsonAnySetter 等注释将每个“广告”的属性“路由”到Ad.ad 映射中。 - 这可能会有所帮助:stackoverflow.com/questions/57312679/…

标签: java json spring spring-mvc jackson


【解决方案1】:

你实际上并不需要Ad 类,它只是一个Map&lt;&gt;AdResponse 看起来像这样:

public class AdsResponse {

    @JsonProperty("ads")
    List<Map<String, AdInfo>> ads;

    @JsonProperty("total_duration")
    long totalDuration;

如果映射中的键是可预测的,您可以将它们设置为 Ad 类的属性,然后 Jackson 会正确映射它们。但由于它们不是(它们看起来像某种 ID),将它们映射到 Map&lt;&gt; 可能是最好的选择。

【讨论】:

    猜你喜欢
    • 2022-07-21
    • 1970-01-01
    • 2011-10-22
    • 1970-01-01
    • 1970-01-01
    • 2019-11-25
    • 2015-10-19
    • 2019-07-27
    • 1970-01-01
    相关资源
    最近更新 更多