Java 如何使用Jackson/other库将json响应对象映射到首选格式?
我从第三方web服务获得以下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": {
{
"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并没有真正为您提供提取特定值的方法,因为它使用流解析,这意味着它没有在内存中保留完整的表示,因此不提供任意节点检索。