避免使用 Objectmapper [Java 8] 调用 toString
Avoid calling toString with Objectmapper [Java 8]
我实现了我想要完成的目标,但是,我对实现我的目标的不必要的(?)字符串解析不满意。
这里是简化代码:
HttpURLConnection con = null;
URL url = new URL(URL);
con = (HttpURLConnection) url.openConnection();
// set connection parameters and make a GET-call
con.setRequestMethod("GET");
//Must be a better way?
InputStream inputStream = con.getInputStream();
BufferedReader in = new BufferedReader(new InputStreamReader(inputStream));
StringBuilder response = new StringBuilder();
String currentLine;
//Build the string from the response from con
while ((currentLine = in.readLine()) != null)
response.append(currentLine);
in.close();
ObjectMapper objectMapper = new ObjectMapper();
JsonNode jsonNode = objectMapper.readTree(response.toString());
// I only want the child-node
String myArray = jsonNode.get("parent").get("child").toString();
// Map the response to my object
List<Car> car = objectMapper.readValue(myArray, new TypeReference<List<Car>>(){});
像
这样的手动解析太多了
- 正在将 Http 连接输入流读取到
StringBuilder
,然后调用 toString()
。
- 检索
JsonNode
并调用 toString()
jsonNode.get("parent").get("child").toString()
实现我的目标。我绝不是任何高级开发人员,我很乐意接受建议以及如何删除“不必要的”解析。
- 来自 API 调用的响应已经 JSON
- 只能使用 HttpURLConnection-class 进行 API-调用。
我的车class:
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"id",
"color"})
public class Car {
@JsonProperty("id")
public String id;
@JsonProperty("color")
public String color;
}
很高兴看到您想要改进您的代码。
读取输入流到StringBuilder
调用jsonNode.toString()
真的没必要。在大多数情况下,总有一个有用的 API 可以满足您的需要。
这是我的建议:
- 使用 ObjectMapper#readTree(InputStream) 来简化使用 HTTP 输入流的部分。
JsonNode jsonNode = objectMapper.readTree(con.getInputStream());
- 检索目标
JsonNode
后,创建一个JsonParser
然后调用
JsonParser jsonParser = new TreeTraversingParser(jsonNode.get("parent").get("child"));
objectMapper.readValue(jsonParser,new TypeReference<List<Car>>(){});
我实现了我想要完成的目标,但是,我对实现我的目标的不必要的(?)字符串解析不满意。
这里是简化代码:
HttpURLConnection con = null;
URL url = new URL(URL);
con = (HttpURLConnection) url.openConnection();
// set connection parameters and make a GET-call
con.setRequestMethod("GET");
//Must be a better way?
InputStream inputStream = con.getInputStream();
BufferedReader in = new BufferedReader(new InputStreamReader(inputStream));
StringBuilder response = new StringBuilder();
String currentLine;
//Build the string from the response from con
while ((currentLine = in.readLine()) != null)
response.append(currentLine);
in.close();
ObjectMapper objectMapper = new ObjectMapper();
JsonNode jsonNode = objectMapper.readTree(response.toString());
// I only want the child-node
String myArray = jsonNode.get("parent").get("child").toString();
// Map the response to my object
List<Car> car = objectMapper.readValue(myArray, new TypeReference<List<Car>>(){});
像
这样的手动解析太多了- 正在将 Http 连接输入流读取到
StringBuilder
,然后调用toString()
。 - 检索
JsonNode
并调用toString()
jsonNode.get("parent").get("child").toString()
实现我的目标。我绝不是任何高级开发人员,我很乐意接受建议以及如何删除“不必要的”解析。
- 来自 API 调用的响应已经 JSON
- 只能使用 HttpURLConnection-class 进行 API-调用。
我的车class:
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"id",
"color"})
public class Car {
@JsonProperty("id")
public String id;
@JsonProperty("color")
public String color;
}
很高兴看到您想要改进您的代码。
读取输入流到StringBuilder
调用jsonNode.toString()
真的没必要。在大多数情况下,总有一个有用的 API 可以满足您的需要。
这是我的建议:
- 使用 ObjectMapper#readTree(InputStream) 来简化使用 HTTP 输入流的部分。
JsonNode jsonNode = objectMapper.readTree(con.getInputStream());
- 检索目标
JsonNode
后,创建一个JsonParser
然后调用
JsonParser jsonParser = new TreeTraversingParser(jsonNode.get("parent").get("child"));
objectMapper.readValue(jsonParser,new TypeReference<List<Car>>(){});