java - 从 json 响应中解析一个值,其中大部分负载都是冗余的

标签 java json spring spring-boot

要从此 json 负载中提取 name 字段:

[{"name":"Estonia","topLevelDomain":[".ee"],"alpha2Code":"EE","alpha3Code":"EST","callingCodes":["372"],"capital":"Tallinn","altSpellings":["EE","Eesti","Republic of Estonia","Eesti Vabariik"],"region":"Europe","subregion":"Northern Europe","population":1315944,"latlng":[59.0,26.0],"demonym":"Estonian","area":45227.0,"gini":36.0,"timezones":["UTC+02:00"],"borders":["LVA","RUS"],"nativeName":"Eesti","numericCode":"233","currencies":[{"code":"EUR","name":"Euro","symbol":"€"}],"languages":[{"iso639_1":"et","iso639_2":"est","name":"Estonian","nativeName":"eesti"}],"translations":{"de":"Estland","es":"Estonia","fr":"Estonie","ja":"エストニア","it":"Estonia","br":"Estônia","pt":"Estónia","nl":"Estland","hr":"Estonija","fa":"استونی"},"flag":"https://restcountries.eu/data/est.svg","regionalBlocs":[{"acronym":"EU","name":"European Union","otherAcronyms":[],"otherNames":[]}],"cioc":"EST"}]

我计划使用类似于以下的代码:

@Service
public class RestService {

    private final RestTemplate restTemplate;

    public RestService(RestTemplateBuilder restTemplateBuilder) {
        this.restTemplate = restTemplateBuilder.build();
    }

    public String getPostsPlainJSON() {
        String url = "hhttps://restcountries.eu/rest/v2/name/eesti";
        return this.restTemplate.getForObject(url, MyCustomObject.class);
    }
}

MyCustomObject 将包含许多我不关心的冗余字段,因为我只想访问上面示例中的名称 "Estonia"。是否有另一种方法可以解析字段 name,而不是创建映射到整个 JSON 响应的新 MyCustomObject pojo?

最佳答案

您可以使用 JSONPath

public static void main(String[] args) {
    String json = "[{\"name\":\"Estonia\",\"topLevelDomain\":[\".ee\"],\"alpha2Code\":\"EE\",\"alpha3Code\":\"EST\",\"callingCodes\":[\"372\"],\"capital\":\"Tallinn\",\"altSpellings\":[\"EE\",\"Eesti\",\"Republic of Estonia\",\"Eesti Vabariik\"],\"region\":\"Europe\",\"subregion\":\"Northern Europe\",\"population\":1315944,\"latlng\":[59.0,26.0],\"demonym\":\"Estonian\",\"area\":45227.0,\"gini\":36.0,\"timezones\":[\"UTC+02:00\"],\"borders\":[\"LVA\",\"RUS\"],\"nativeName\":\"Eesti\",\"numericCode\":\"233\",\"currencies\":[{\"code\":\"EUR\",\"name\":\"Euro\",\"symbol\":\"€\"}],\"languages\":[{\"iso639_1\":\"et\",\"iso639_2\":\"est\",\"name\":\"Estonian\",\"nativeName\":\"eesti\"}],\"translations\":{\"de\":\"Estland\",\"es\":\"Estonia\",\"fr\":\"Estonie\",\"ja\":\"エストニア\",\"it\":\"Estonia\",\"br\":\"Estônia\",\"pt\":\"Estónia\",\"nl\":\"Estland\",\"hr\":\"Estonija\",\"fa\":\"استونی\"},\"flag\":\"https://restcountries.eu/data/est.svg\",\"regionalBlocs\":[{\"acronym\":\"EU\",\"name\":\"European Union\",\"otherAcronyms\":[],\"otherNames\":[]}],\"cioc\":\"EST\"}]";
    
    String jsonPath = "$.[*].name";  
    DocumentContext jsonContext = JsonPath.parse(json);
    List<String> result = jsonContext.read(jsonPath);
    System.out.println("name :: "+result.get(0));
    
    result = jsonContext.read("$.[*].capital"); //To get Captial
    System.out.println("Capital :: "+result.get(0));    
}

输出

name :: Estonia
Capital :: Tallinn

Maven 依赖

<dependency>
    <groupId>com.jayway.jsonpath</groupId>
    <artifactId>json-path</artifactId>
    <version>2.4.0</version>
</dependency>

关于java - 从 json 响应中解析一个值,其中大部分负载都是冗余的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63892105/

相关文章:

java - 如何使用 Spring Integration 访问邮箱文件夹

java - ListenableFuture 或调用函数来处理任务结果?

java - 远程运行 Java 项目

java - "Relaxed"Jackson 的字段名称

javascript - 使用 AngularJS 中的复选框按多个条件过滤数据

java - 使用键作为值反序列化 Jackson

java - 访问 ArrayDeque 中的每个元素

java - logback 根本不记录到控制台

java - 未找到类型返回值的转换器 - 带数据库调用的 Spring Rest API

java - 在 HashMap 中设置默认值