Невозможно записать JSON: прямая ссылка на себя, ведущая к циклу - PullRequest
3 голосов
/ 17 января 2020

Получение этой ошибки:

вложенное исключение: com.faster xml .jackson.databind.JsonMappingException: прямая прямая ссылка, ведущая к циклу (через цепочку ссылок: com.google.gson. JsonObject ["asJsonObject"])

при попытке сделать это:

 restTemplate.postForObject(url_final, convertedObject, Object[].class);

где convertedObject является JSONObject, а urlfinal является String URL .

Полезная нагрузка:

"data" : [
  {"FILENAME":"EEC1.TXT",
   "ERRORDESCRIPTION":"FTD-07-INVALID CHARACTER FOUND IN THE FILE.",
   "LINENO":3},
  {"FILENAME":"SEC1.TXT",
   "ERRORDESCRIPTION":"26-FTD-07-INVALID CHARACTER FOUND IN THE FILE.",
    "LINENO":447}]

Мой код:

JSONObject output = new JSONObject(payload);
JSONArray jsonArray = output.getJSONArray("data");
JSONObject objects = jsonArray.getJSONObject(0);
String fileName = objects.getString("FILENAME");
int lineNumber = objects.getInt("LINENO");
String errordesc = objects.getString("ERRORDESCRIPTION");
String tempor = "{\"activityType\": \"trial.start\",\"aFileName\":\""  
              + fileName
              + "\",\"aLINENO\": \""
              + lineNumber
              + "\",\"aREFNO\": \"" 
              + TxnNo
              + "\",    \"aERRORDESCRIPTION\": \""+errordesc+"\"}";
JsonObject convertedObject = new Gson().fromJson(tempor, JsonObject.class);
restTemplate.postForObject(url_final, convertedObject, Object[].class);

1 Ответ

0 голосов
/ 17 января 2020

В десяти строках вы перепутали 3 разные библиотеки JSON:

Вы должны пропустить первые два и использовать только Jackson. Приведенный выше код после изменений может выглядеть следующим образом:

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.json.JsonMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;

....

ObjectMapper mapper = JsonMapper.builder().build();

JsonNode output = mapper.readTree(payload);

ArrayNode jsonArray = (ArrayNode)output.get("data");
JsonNode objects = jsonArray.get(0);
String fileName = objects.get("FILENAME").asText();
int lineNumber = objects.get("LINENO").asInt();
String errordesc = objects.get("ERRORDESCRIPTION").asText();
String tempor = "{\"activityType\": \"trial.start\",\"aFileName\":\""
        + fileName
        + "\",\"aLINENO\": \""
        + lineNumber
        + "\",\"aREFNO\": \""
        + TxnNo
        + "\",    \"aERRORDESCRIPTION\": \""+errordesc+"\"}";
JsonNode convertedObject = mapper.readTree(tempor);

Начиная с версии 2.10.0 вы можете использовать JsonMapper.builder().build(), но в предыдущих версиях вы могли просто создать новый экземпляр с помощью new ObjectMapper(), что также хорошо.

...