避免使用 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>>(){});

这样的手动解析太多了
  1. 正在将 Http 连接输入流读取到 StringBuilder,然后调用 toString()
  2. 检索 JsonNode 并调用 toString()
jsonNode.get("parent").get("child").toString()

实现我的目标。我绝不是任何高级开发人员,我很乐意接受建议以及如何删除“不必要的”解析。

  1. 来自 API 调用的响应已经 JSON
  2. 只能使用 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 可以满足您的需要。 这是我的建议:

  1. 使用 ObjectMapper#readTree(InputStream) 来简化使用 HTTP 输入流的部分。
JsonNode jsonNode = objectMapper.readTree(con.getInputStream());
  1. 检索目标JsonNode后,创建一个JsonParser然后调用
JsonParser jsonParser = new TreeTraversingParser(jsonNode.get("parent").get("child"));
objectMapper.readValue(jsonParser,new TypeReference<List<Car>>(){});