I am trying to parse JSON using a Notes agent, JSON is fetched using Apache HttpClient.
我试图使用Notes代理解析JSON,使用Apache HttpClient获取JSON。
Here is the code that return the JSON
这是返回JSON的代码
import lotus.domino.*;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.HttpClientBuilder;
Session session = getSession();
AgentContext agentContext = session.getAgentContext();
HttpClient client = HttpClientBuilder.create().build();
HttpGet request = new HttpGet("http://api.acme.com/customer");
request.addHeader("accept", "application/json");
request.addHeader("Host", "api.acme.com");
request.addHeader("X-Api-Version", "1.0");
request.addHeader("Authorization", "Basic ...");
HttpResponse response = client.execute(request);
The JSON Looks like this.
JSON看起来像这样。
[
{
"id": 123456,
"insertDate": "2014-05-12T16:51:38.343",
"read": false,
"site": "acme.com",
"Email": "john.doe@acme.com",
"location": "/customer/1212?v=1.0"
}
]
I have tried to use JSONObject
and JSONArray
from JSON.org but could not get it to work I need some example code from the json.org package or other ways to parse the json.
我曾尝试使用JSON.org中的JSONObject和JSONArray但无法使其工作我需要一些来自json.org包的示例代码或其他解析json的方法。
1 个解决方案
#1
16
You can get the JSON from the Entity in the HttpResponse using HttpResponse#getEntity. Once you have that, then just create a new JSONArray and iterate the array to access the values in your JSON object:
您可以使用HttpResponse#getEntity从HttpResponse中的Entity获取JSON。完成后,只需创建一个新的JSONArray并迭代该数组即可访问JSON对象中的值:
String json = IOUtils.toString(response.getEntity().getContent());
JSONArray array = new JSONArray(json);
for (int i = 0; i < array.length(); i++) {
JSONObject object = array.getJSONObject(i);
log.info("the id is {}", object.getInt("id"));
log.info("the insertDate is {}", object.getString("insertDate"));
log.info("read is {}", object.getBoolean("read"));
log.info("the site is {}", object.getString("site"));
log.info("the Email is {}", object.getString("Email"));
log.info("the location is {}", object.getString("location"));
}
I saved the JSON in a JSONBlob at http://jsonblob.com/537a43bfe4b047fa2ef5f15d and created a unit test that requests that JSON:
我在JSONBlob中将JSON保存在http://jsonblob.com/537a43bfe4b047fa2ef5f15d并创建了一个请求JSON的单元测试:
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.HttpClientBuilder;
import org.json.JSONArray;
import org.json.JSONObject;
import org.junit.Test;
@Slf4j
public class JsonTest {
@Test
public void test() throws Exception {
HttpClient client = HttpClientBuilder.create().build();
HttpGet request = new HttpGet("http://jsonblob.com/api/jsonBlob/537a43bfe4b047fa2ef5f15d");
request.addHeader("accept", "application/json");
HttpResponse response = client.execute(request);
String json = IOUtils.toString(response.getEntity().getContent());
JSONArray array = new JSONArray(json);
for (int i = 0; i < array.length(); i++) {
JSONObject object = array.getJSONObject(i);
log.info("the id is {}", object.getInt("id"));
log.info("the insertDate is {}", object.getString("insertDate"));
log.info("read is {}", object.getBoolean("read"));
log.info("the site is {}", object.getString("site"));
log.info("the Email is {}", object.getString("Email"));
log.info("the location is {}", object.getString("location"));
}
}
}
And the output from running it is:
运行它的输出是:
11:23:19.508 [main] INFO JsonTest - the id is 123456
11:23:19.516 [main] INFO JsonTest - the insertDate is 2014-05-12T16:51:38.343
11:23:19.516 [main] INFO JsonTest - read is false
11:23:19.516 [main] INFO JsonTest - the site is acme.com
11:23:19.516 [main] INFO JsonTest - the Email is john.doe@acme.com
11:23:19.516 [main] INFO JsonTest - the location is /customer/1212?v=1.0
I used the IOUtils class to convert the InputStream from the HttpResponse Entity, but this can be done anyway you like (and converting it like I did may not be the best idea depending on how big the JSON is).
我使用IOUtils类来转换来自HttpResponse实体的InputStream,但是无论如何你都可以这样做(并且像我那样转换它可能不是最好的主意,这取决于JSON的大小)。
#1
16
You can get the JSON from the Entity in the HttpResponse using HttpResponse#getEntity. Once you have that, then just create a new JSONArray and iterate the array to access the values in your JSON object:
您可以使用HttpResponse#getEntity从HttpResponse中的Entity获取JSON。完成后,只需创建一个新的JSONArray并迭代该数组即可访问JSON对象中的值:
String json = IOUtils.toString(response.getEntity().getContent());
JSONArray array = new JSONArray(json);
for (int i = 0; i < array.length(); i++) {
JSONObject object = array.getJSONObject(i);
log.info("the id is {}", object.getInt("id"));
log.info("the insertDate is {}", object.getString("insertDate"));
log.info("read is {}", object.getBoolean("read"));
log.info("the site is {}", object.getString("site"));
log.info("the Email is {}", object.getString("Email"));
log.info("the location is {}", object.getString("location"));
}
I saved the JSON in a JSONBlob at http://jsonblob.com/537a43bfe4b047fa2ef5f15d and created a unit test that requests that JSON:
我在JSONBlob中将JSON保存在http://jsonblob.com/537a43bfe4b047fa2ef5f15d并创建了一个请求JSON的单元测试:
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.HttpClientBuilder;
import org.json.JSONArray;
import org.json.JSONObject;
import org.junit.Test;
@Slf4j
public class JsonTest {
@Test
public void test() throws Exception {
HttpClient client = HttpClientBuilder.create().build();
HttpGet request = new HttpGet("http://jsonblob.com/api/jsonBlob/537a43bfe4b047fa2ef5f15d");
request.addHeader("accept", "application/json");
HttpResponse response = client.execute(request);
String json = IOUtils.toString(response.getEntity().getContent());
JSONArray array = new JSONArray(json);
for (int i = 0; i < array.length(); i++) {
JSONObject object = array.getJSONObject(i);
log.info("the id is {}", object.getInt("id"));
log.info("the insertDate is {}", object.getString("insertDate"));
log.info("read is {}", object.getBoolean("read"));
log.info("the site is {}", object.getString("site"));
log.info("the Email is {}", object.getString("Email"));
log.info("the location is {}", object.getString("location"));
}
}
}
And the output from running it is:
运行它的输出是:
11:23:19.508 [main] INFO JsonTest - the id is 123456
11:23:19.516 [main] INFO JsonTest - the insertDate is 2014-05-12T16:51:38.343
11:23:19.516 [main] INFO JsonTest - read is false
11:23:19.516 [main] INFO JsonTest - the site is acme.com
11:23:19.516 [main] INFO JsonTest - the Email is john.doe@acme.com
11:23:19.516 [main] INFO JsonTest - the location is /customer/1212?v=1.0
I used the IOUtils class to convert the InputStream from the HttpResponse Entity, but this can be done anyway you like (and converting it like I did may not be the best idea depending on how big the JSON is).
我使用IOUtils类来转换来自HttpResponse实体的InputStream,但是无论如何你都可以这样做(并且像我那样转换它可能不是最好的主意,这取决于JSON的大小)。