我有一个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'}