Как я могу игнорировать корневой узел при чтении в json rest api? - PullRequest
0 голосов
/ 12 февраля 2019

Я читаю в API остальных, который возвращает файл Json .Мне нужно игнорировать узлы "result" и "optionChain".Я использую Spring Boot с Джексоном , чтобы справиться с сопоставлением объектов.

Заранее спасибо!

Для файла Json нажмите здесь

Вот мой Main:

import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.http.*;
import org.springframework.web.client.RestTemplate;

import java.util.Collections;

@SpringBootApplication
public class OptionsImpliedMovementApplication implements CommandLineRunner {

    public static void main(String[] args) {
        SpringApplication.run(OptionsImpliedMovementApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        RestTemplate restTemplate = new RestTemplate();
        HttpHeaders headers = new HttpHeaders();
        headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
        String resourceURL = url;
        HttpEntity<String> entity = new HttpEntity<>(headers);
        ResponseEntity<String> response = restTemplate.exchange(resourceURL, HttpMethod.GET,entity, String.class);

        String rawJson = response.getBody();


        ObjectMapper mapper = new ObjectMapper();

        //need to read in json ignoring root node



    }

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Быстрый (исполнитель) и работает.

final ObjectMapper objectMapper = new ObjectMapper();
final JsonNode jsonNode = objectMapper.readTree(rawJson);
final JsonNode result = jsonNode.get("optionChain")
                                .get("result");

final JsonNode firstResult = result.get(0);
final YourResultClass resultObject = objectMapper.treeToValue(firstResult, YourResultClass.class);

Если вам нужно игнорировать неизвестные поля

final ObjectMapper objectMapper = 
      new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
0 голосов
/ 12 февраля 2019

Поскольку вы уже получаете ответ JSON, тогда рекомендую использовать

restTemplate.exchange(URL, HttpMethod.GET, requestEntity, MyPOJO.class);

вместо String.class для определения собственного POJO на основе ответа JSON, который вы ввели в файл.json.

Удобным способом вы можете быстро и легко сгенерировать POJO для вашего JSON из: http://www.jsonschema2pojo.org/.

Так оно должно выглядеть следующим образом:

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"optionChain"
})
public class MyPOJO {

@JsonProperty("optionChain")
private OptionChain optionChain;
// getters and setters 
}

И еще один:

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"result",
"error"
})
public class OptionChain {

@JsonProperty("result")
private List<Result> result = null;
@JsonProperty("error")
private Object error;
// getter and setters

}

И другие, как:

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"expirationDate",
"hasMiniOptions",
"calls",
"puts"
})
public class Option {

@JsonProperty("expirationDate")
private Integer expirationDate;
@JsonProperty("hasMiniOptions")
private Boolean hasMiniOptions;
@JsonProperty("calls")
private List<Call> calls = null;
@JsonProperty("puts")
private List<Put> puts = null;

Так что, как только вы получите ответ как:

ResponseEntity<MyPOJO> response = restTemplate.exchange(resourceURL, HttpMethod.GET,entity, MyPOJO.class);

Тогда response.getBody будетдайте контент внутри узла optionChain, который вы ищете.Затем вы можете нормально перейти к любому нужному узлу, так как теперь у вас есть все в простых Java-объектах, и вы можете игнорировать все, что хотите, или использовать все, что вам нужно.

Используя objectMapper, вы также можете добиться того же:

 ObjectMapper mapper = new ObjectMapper();
     MyPojo myPojo=  mapper.readValue(rawJson, MyPojo.class);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...