有条件地将JSON列表遍历并反序列化为Java POJO String

我有以下格式的JSON网址列表:

{
  "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"
                }
              ]
            }
          ]
        }
      }
    ]
  }
}

最初我有类似的东西,给了我一个Urls清单,清单中的所有内容。

@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列表。

我需要创建某种自定义解串器吗?

ergasfgsafg 回答:有条件地将JSON列表遍历并反序列化为Java POJO String

在这种情况下,最好将JsonPathJackson一起使用。 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'}
本文链接:https://www.f2er.com/3092030.html

大家都在问