Java 将 JSON 响应解析为对象
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/18808018/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Parse a JSON response as an object
提问by rtf
Good evening,
I am a newbie in web services and i just want to write a simple client that simply gets responses from REST calls.
I downloaded and added jersey-bundle-1.17.1.jar
to my build path and i found a working piece of code that makes a REST call to a url and returns a response as a String
.
晚上好,
我是 Web 服务的新手,我只想编写一个简单的客户端,它只是从 REST 调用中获取响应。
我下载并添加jersey-bundle-1.17.1.jar
到我的构建路径中,我发现了一段工作代码,它对一个 url 进行 REST 调用并以String
.
import javax.ws.rs.core.MediaType;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
public class TestJerseyClient {
public static void main(String[] args) {
try {
Client client = Client.create();
WebResource webResource = client
.resource("http://path/to/service");
ClientResponse response = webResource
.accept(MediaType.APPLICATION_JSON)
.get(ClientResponse.class);
if (response.getStatus() != 200)
throw new RuntimeException("Failed : HTTP error code : " + response.getStatus());
String output = response.getEntity(String.class);
System.out.println("Output from Server .... \n");
System.out.println(output);
} catch (Exception e) {
e.printStackTrace();
}
}
}
But i don't want to do string manipulations to get the parts of the response that im interested in.
但我不想进行字符串操作来获取我感兴趣的响应部分。
I would prefer a more structured approach, like getting an Object
instead of a string
(a JSON
Object, a Map<K,V>
Object, etc...)
我更喜欢更结构化的方法,比如获取一个Object
而不是一个字符串
(一个JSON
对象、一个Map<K,V>
对象等......)
尝试#1 -
Map<K,V>
Map<K,V>
Sep 15, 2013 2:46:13 AM com.sun.jersey.api.client.ClientResponse getEntity
SEVERE: A message body reader for Java class java.util.Map, and Java type java.util.Map<java.lang.String, java.lang.Object>, and MIME media type application/json; charset=UTF-8 was not found
Sep 15, 2013 2:46:13 AM com.sun.jersey.api.client.ClientResponse getEntity
SEVERE: The registered message body readers compatible with the MIME media type are:
application/json; charset=UTF-8 ->
com.sun.jersey.json.impl.provider.entity.JSONJAXBElementProvider$App
com.sun.jersey.json.impl.provider.entity.JSONRootElementProvider$App
com.sun.jersey.json.impl.provider.entity.JSONListElementProvider$App
*/* ->
com.sun.jersey.core.impl.provider.entity.FormProvider
com.sun.jersey.core.impl.provider.entity.StringProvider
com.sun.jersey.core.impl.provider.entity.ByteArrayProvider
com.sun.jersey.core.impl.provider.entity.FileProvider
com.sun.jersey.core.impl.provider.entity.InputStreamProvider
com.sun.jersey.core.impl.provider.entity.DataSourceProvider
com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider$General
com.sun.jersey.core.impl.provider.entity.ReaderProvider
com.sun.jersey.core.impl.provider.entity.DocumentProvider
com.sun.jersey.core.impl.provider.entity.SourceProvider$StreamSourceReader
com.sun.jersey.core.impl.provider.entity.SourceProvider$SAXSourceReader
com.sun.jersey.core.impl.provider.entity.SourceProvider$DOMSourceReader
com.sun.jersey.json.impl.provider.entity.JSONJAXBElementProvider$General
com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider$General
com.sun.jersey.core.impl.provider.entity.XMLListElementProvider$General
com.sun.jersey.core.impl.provider.entity.XMLRootObjectProvider$General
com.sun.jersey.core.impl.provider.entity.EntityHolderReader
com.sun.jersey.json.impl.provider.entity.JSONRootElementProvider$General
com.sun.jersey.json.impl.provider.entity.JSONListElementProvider$General
com.sun.jersey.api.client.ClientHandlerException: A message body reader for Java class java.util.Map, and Java type java.util.Map<java.lang.String, java.lang.Object>, and MIME media type application/json; charset=UTF-8 was not found
at com.sun.jersey.api.client.ClientResponse.getEntity(ClientResponse.java:561)
at com.sun.jersey.api.client.ClientResponse.getEntity(ClientResponse.java:535)
at com.sun.jersey.api.client.WebResource.handle(WebResource.java:696)
at com.sun.jersey.api.client.WebResource.access0(WebResource.java:74)
at com.sun.jersey.api.client.WebResource$Builder.get(WebResource.java:512)
at rest.TestJerseyClientAdvanced.main(TestJerseyClientAdvanced.java:36)
回答by Nambi
see this example ...click this linkfor more info
看到这个例子...点击这个链接了解更多信息
// The request also includes the userip parameter which provides the end
// user's IP address. Doing so will help distinguish this legitimate
// server-side traffic from traffic which doesn't come from an end-user.
URL url = new URL(
"https://www.websitelink.com//folderresponsedata
+ "q=Paris%20Hilton&userip=USERS-IP-ADDRESS");
URLConnection connection = url.openConnection();
connection.addRequestProperty("Referer", /* Enter the URL of your site here */);
String line;
StringBuilder builder = new StringBuilder();
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
while((line = reader.readLine()) != null) {
builder.append(line);
}
JSONObject json = new JSONObject(builder.toString());
// now have some fun with the results...
回答by eugen
You can use Gensonlibrary.
您可以使用Genson库。
// register genson in jersey client
ClientConfig cfg = new DefaultClientConfig(GensonJsonConverter.class);
Client client = Client.create(cfg);
WebResource webResource = client.resource("http://path/to/service");
// you can map it to a pojo, no need to have a string or map
SomePojo pojo = webResource
.accept(MediaType.APPLICATION_JSON)
.get(SomePojo.class);
回答by pNut
I recommend you use Hymanson for (un)marshalling JSON responses. This can be done is two steps as below.
我建议您使用 Hymanson 来(取消)编组 JSON 响应。这可以通过以下两个步骤完成。
Step1. create a java bean with member/object names that match the expected response. e.g, MyResponse.class
第1步。创建一个具有与预期响应匹配的成员/对象名称的 java bean。例如,MyResponse.class
Step2. use the java bean when reading the entity from the client response.
第2步。从客户端响应中读取实体时使用 java bean。
private static ClientConfig clientConfig = new DefaultClientConfig();
clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE);
ClientResponse response = Client.create(clientConfig).
resource(uri).accept(MediaType.APPLICATION_JSON).
header("content-type", MediaType.APPLICATION_JSON).
get(MY_RESPONSE.class);
MyResponse output = response.getEntity(MyResponse.class);
回答by Yuriy Tumakha
If you need to get only few properties from big JSON response, you can use Jersey client and JsonArray or JsonObject entity.
如果您只需要从大型 JSON 响应中获取少量属性,您可以使用 Jersey 客户端和 JsonArray 或 JsonObject 实体。
String url = "http://api.goeuro.com/api/v2/position/suggest/en/";
String city = "New York";
Client client = ClientBuilder.newClient();
WebTarget webTarget = client.register(JsonProcessingFeature.class).target(url);
JsonArray jsonArray = webTarget.path(city)
.request(MediaType.APPLICATION_JSON_TYPE).get(JsonArray.class);
for (JsonObject jsonObject : jsonArray.getValuesAs(JsonObject.class)) {
JsonObject geoPosition = jsonObject.getJsonObject("geo_position");
System.out.println(Arrays.asList(
jsonObject.getString("name"), jsonObject.getString("type"),
geoPosition.get("latitude"), geoPosition.get("longitude")));
}
Maven dependencies
Maven 依赖项
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-client</artifactId>
<version>2.22.1</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-processing</artifactId>
<version>2.22.1</version>
</dependency>
回答by Rzv Razvan
Simple as that :
就那么简单 :
ObjectMapper mapper = new ObjectMapper();
String json = "json value";
MyClass obj = mapper.readValue(json , MyClass .class);