有条件地遍历JSON列表并将值取消序列化为Java POJO字符串



我有一个JSON URL列表,格式如下:

{
"level": 1,
"secondLevel": {
"level": 2,
"thirdLevel": [
{
"level": 3,
"fourthLevel": {
"level": 4,
"fifthLevel": [
{
"type": "URLS",
"listOfimageURLs": [
{
"urlNo": "Num1",
"data": "num1Data"
},
{
"urlNo": "Num2",
"data": "num2Data"
},
{
"urlNo": "Num3",
"data": "num3Data"
}
]
}
]
}
}
]
}
}

最初我有这样的东西,给了我一个包含列表中所有内容的URL列表。

@Data
@NoArgsConstructor
public class URLDetail {
private String type;
private List<Urls> urlData;
}

现在我有下面的Java POJO,我正试图将其取消序列化,值num2Data设置在字段urlData

@Data
@NoArgsConstructor
public class URLDetail {
private String type;
private String urlData;
}

我正试图弄清楚如何有条件地循环使用JSON列表-url对于任何等于"Num2"的urlNo,将相关的"数据"字段值(在本例中为"num2Data"(取消序列化为URLDetail POJO字段urlData?

我有通常的

mapper.readValue(json, URLDetail.class);

如果我删除urlData,则type字段设置正确,但完全不确定是否应用逻辑来解析JSON中的url列表。

我需要创建某种自定义的取消序列化程序吗?

在这种情况下,将JsonPath与Jackson一起使用是一个不错的选择。JsonPath允许我们在JSON有效载荷中找到所需的节点,并且在Jackson的帮助下,我们可以很容易地将其映射到POJO

简单示例:

import com.fasterxml.jackson.annotation.JsonProperty;
import com.jayway.jsonpath.Configuration;
import com.jayway.jsonpath.JsonPath;
import com.jayway.jsonpath.Option;
import com.jayway.jsonpath.TypeRef;
import com.jayway.jsonpath.spi.json.JacksonJsonProvider;
import com.jayway.jsonpath.spi.json.JsonProvider;
import com.jayway.jsonpath.spi.mapper.JacksonMappingProvider;
import com.jayway.jsonpath.spi.mapper.MappingProvider;
import java.io.File;
import java.util.EnumSet;
import java.util.List;
import java.util.Set;
public class JsonPathApp {
public static void main(String[] args) throws Exception {
File jsonFile = new File("./resource/test.json").getAbsoluteFile();
// Initialize JsonPath to use Jackson
Configuration.setDefaults(new JacksonDefaultConfiguration());
String jsonPath = String.format("$..listOfimageURLs[?(@.urlNo == "%s")]", "Num2");
TypeRef<List<URLDetail>> urlDetailsType = new TypeRef<List<URLDetail>>() {
};
List<URLDetail> details = JsonPath.parse(jsonFile).read(jsonPath, urlDetailsType);
details.forEach(System.out::println);
}
}
class URLDetail {
@JsonProperty("urlNo")
private String type;
@JsonProperty("data")
private String urlData;
// getters, setters, toString or lombok annotations
}
class JacksonDefaultConfiguration implements Configuration.Defaults {
private final JsonProvider jsonProvider = new JacksonJsonProvider();
private final MappingProvider mappingProvider = new JacksonMappingProvider();
@Override
public JsonProvider jsonProvider() {
return jsonProvider;
}
@Override
public Set<Option> options() {
return EnumSet.noneOf(Option.class);
}
@Override
public MappingProvider mappingProvider() {
return mappingProvider;
}
}

以上代码打印:

URLDetail{type='Num2', urlData='num2Data'}

最新更新