Исключение декодирования потока: неожиданный символ ('[' (код 91)): ожидалось двойная кавычка для начала имени поля - PullRequest
0 голосов
/ 25 февраля 2019

При декодировании Flux JSON в Java объект я получаю следующее исключение:

2019-02-25 13:44:39.136 TRACE [{}] 25292 --- [reactor-http-nio-4] o.s.w.r.f.c.ExchangeFunctions            : [762021a9] Response 200 OK, headers={masked}
2019-02-25 13:44:39.195 ERROR [{}] 25292 --- [reactor-http-nio-4] r.M.C.2                                  : | onError(org.springframework.core.codec.DecodingException: JSON decoding error: Unexpected character ('[' (code 91)): was expecting double-quote to start field name; nested exception is com.fasterxml.jackson.core.JsonParseException: Unexpected character ('[' (code 91)): was expecting double-quote to start field name
 at [Source: UNKNOWN; line: 2, column: 3])
2019-02-25 13:44:39.196 ERROR [{}] 25292 --- [reactor-http-nio-4] r.M.C.2                                  : 
org.springframework.core.codec.DecodingException: JSON decoding error: Unexpected character ('[' (code 91)): was expecting double-quote to start field name; nested exception is com.fasterxml.jackson.core.JsonParseException: Unexpected character ('[' (code 91)): was expecting double-quote to start field name
 at [Source: UNKNOWN; line: 2, column: 3]
    at org.springframework.http.codec.json.Jackson2Tokenizer.tokenize(Jackson2Tokenizer.java:104) ~[spring-web-5.1.2.RELEASE.jar:5.1.2.RELEASE]

Установка свойства кодека сопоставления следующим образом не решает проблему:

mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);

Здесь ответ JSON :

[
  {
    "id": "111",
    "description": "xyz"
  },
  {
    "id": "222",
    "description": "pqr"
  }
]

Здесь реализация WebClient:

public Mono<List<ItemServiceResponse>> getItems(ItemServiceRequest itemServiceRequest) {
return webClient
        .post()
        .contentType(MediaType.APPLICATION_JSON)
        .header(HttpHeaders.ACCEPT, MediaType.APPLICATION_STREAM_JSON.toString())
        .body(Mono.just(itemServiceRequest), ItemServiceRequest.class)
        .retrieve()
        .bodyToFlux(ItemServiceResponse.class)
        .collectList()
        .log();
}

ЗдесьJava-объект:

@Builder 
@Data 
@AllArgsConstructor 
@NoArgsConstructor 
public class ItemServiceResponse { 
  private String id; 
  private String description; 
}

Ответы [ 2 ]

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

Ужасная проблема !!!Я потратил 4-5 дней на то, чтобы выяснить, что не так в моем коде, и перепробовал все комбинации перестановок, но ничего не получилось.

Но, ребята, почтальон был виновником, да, все верно.

Фактическиструктура ответа JSON, которую я получаю:

{
  [
    {
      "id": "111",
      "description": "xyz"
    },
    {
      "id": "222",
      "description": "pqr"
    }
  ]
}

И это искаженный JSON.Но Почтальон как-то самокорректировался и давал правильный ответ, как JSON упомянул в вопросе, и я больше не смотрел на ответ, потому что код состояния шел с успехом 200.

К счастью, я вызвал команду Curl и получилкоренная причина.Пожалуйста, не верьте почтальону ... чертовски умно исправлять вещи, которые не нужны.

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

ObjectMapper ожидает, что один объект будет отображен из вашего Json отклика как ItemServiceResponse, следовательно, исключение (преобразователь ожидает цитата ).

Вы должны обновить ваш WebClient вызов, чтобы отобразить array из ItemServiceResponse:

public Mono<List<ItemServiceResponse>> getItems(ItemServiceRequest itemServiceRequest) {
    return webClient
            .post()
            .contentType(MediaType.APPLICATION_JSON)
            .header(HttpHeaders.ACCEPT, MediaType.APPLICATION_STREAM_JSON.toString())
            .body(Mono.just(itemServiceRequest), ItemServiceRequest.class)
            .retrieve()
            .bodyToFlux(ItemServiceResponse[].class) // <-- array of ItemServiceResponse
            .collectList()
            .log();
}
...