Java 如何使用Jackson/other库将json响应对象映射到首选格式?

Java 如何使用Jackson/other库将json响应对象映射到首选格式?,java,json,spring,spring-boot,jackson,Java,Json,Spring,Spring Boot,Jackson,我从第三方web服务获得以下JSON响应格式: { "meta": { "code": 200, "requestId": "1" }, "response": { "locations": [ { "id": "1", "name": "XXX", "contact": {

我从第三方web服务获得以下JSON响应格式:

{
    "meta": {
        "code": 200,
        "requestId": "1"
    },
    "response": {
        "locations": [
            {
                "id": "1",
                "name": "XXX",
                "contact": {
                    phone: '123',
                    email: 'abc'
                },
                "location": {
                    "address": [
                        "Finland"
                    ]
                }
            },
            {
                // another location
            }
        ]
    }
}
[
    {
        "id": "1",
        "name": "XXX",
        "phone": '123',
        "address": "Finland"
    },
    {
        // another location
    }
]
以下是我应该从自己的web服务返回的响应:

{
    "meta": {
        "code": 200,
        "requestId": "1"
    },
    "response": {
        "locations": [
            {
                "id": "1",
                "name": "XXX",
                "contact": {
                    phone: '123',
                    email: 'abc'
                },
                "location": {
                    "address": [
                        "Finland"
                    ]
                }
            },
            {
                // another location
            }
        ]
    }
}
[
    {
        "id": "1",
        "name": "XXX",
        "phone": '123',
        "address": "Finland"
    },
    {
        // another location
    }
]
我该怎么办?我读过一些关于Jackson的好文章,但这里只有几个简单的例子,可以将一些简单的JSON obj映射到POJO。在我的例子中,我需要删除一些节点,并深入层次结构以获得嵌套值。到目前为止,这是我在spring boot应用程序中的第一步:

    @GET
    @Path("{query}")
    @Produces("application/json")
    public String getVenues(@PathParam("query") String query){
        return client.target(url).queryParam("query",query).request(...).get(String.class)
    }

欢迎任何帮助、指点和建议

这可以使用谷歌api杰克森工厂来完成。 下面是我对此的建议解决方案

首先,您应该创建一个pojo类,该类响应于您正在接收的json数据和您试图转换为的json数据

 Class ToLocations{
 String id;
 String name;
 String phone;
 String address;
 }
使用GoogleAPI客户端将密钥映射到pojo

下面是与您正在接收的json数据相关的pojo类

 import com.google.api.client.util.Key;
 Class Response{
 @Key("locations")
 List<FromLocations> fromLocations;
 }


 import com.google.api.client.util.Key;
 Class FromLocations
 {
 @Key("id")
 String id;
 @Key("name")
 String name;
 @Key("contact")
 Contact contact;
 @Key("location")
 Location location;
 }  
现在,您可以将包含json对象的requset解析为fromLocations类,如下所示

String responseMeta = response.parseAsString();
JSONObject queryJsonObject = new JSONObject(responseMeta);
if(queryJsonObject.has("locations")){
Response response = JacksonFactory.getDefaultInstance().fromString(responseMeta,Response.class);
List<FromLocations> fromLocationsList = response.getFromLocations();
}   
String responseMeta=response.parseAsString();
JSONObject queryJsonObject=新JSONObject(responseMeta);
if(queryJsonObject.has(“位置”)){
Response Response=JacksonFactory.getDefaultInstance().fromString(responseMeta,Response.class);
List fromLocationsList=response.getFromLocations();
}   
下一步是迭代列表fromLocationsList,从每个FromLocations对象获得所需的值,并将其添加到ToLocations对象


接下来,可以将ToLocations对象添加到列表中并将其转换为json。

您使用的是JAX-RS注释,而不是SpringWeb服务注释。您可以做到这一点,但我建议使用默认的Spring注释,因为如果您使用的是Spring boot starter依赖项,那么这些注释都是自动配置的

首先,您需要创建像请求和响应那样设置的类。大概是这样的:

public class ThirdPartyResponse {   
    MetaData meta;
    Response response;
}

public class Response {
    List<Location> locations;
}

public class MetaData {
    String code;
    String requestId;    
}

public class Location {
    String id;
    String name;
    Contact contact;
    LocationDetails location;
}

public class Contact {
    String phone;
    String email;
}

public class LocationDetails {
    List<String> address;
}
正如您所看到的,SpringBoot抽象了大量JSON处理,并使其非常轻松

请看一看Spring指南,这些指南非常有用:

使用RestTemplate使用服务

使用@RestController创建web服务

虽然这是一种合理的通用方法,但它没有利用Spring或Spring Boot提供的任何功能。谢谢您的回答。按照你的指示,我可以很容易地找回{“id”:“1”,“name”:“XXX”}。但是我怎样才能取回“电话”和“地址”属性呢?我不确定我需要多少参与/手动处理。@GreatQuestion我添加了更多的细节,但基本上你需要不断添加更多的类,以完全符合你在JSON中得到的响应。对于每个JSON对象,您都需要一个类,对于JSON列表,您需要一个列表。这就是为什么我要问这个问题,因为我发现这种方法可能非常麻烦,如果您必须获得非常嵌套的属性,那么需要我们创建一组模型。在这种情况下,我们只需要返回列表,但我们必须创建第三方响应、元数据、响应、联系人、位置详细信息……您不需要为不关心的内容包含类或字段。我发现对于嵌套响应,我通常使用内部静态类来保持所有嵌套都非常本地化,这比手动解析要容易。如果您不想创建域对象,Jackson还将解析映射。它有点难看,但非常灵活。据我所知,Jackson并没有真正为您提供提取特定值的方法,因为它使用流解析,这意味着它没有在内存中保留完整的表示,因此不提供任意节点检索。