Проблема чтения формата Json с помощью Gson Java - PullRequest
0 голосов
/ 02 мая 2019

Мне нужно преобразовать полную строку в формат Json, проблема в том, что внутри полезной нагрузки есть вложенное поле, которое также должно читаться как Json.

Мой код Java выглядит так:

  • Сначала я прочитал строку:
    String payload
    ="{\"appId\":\"APP02\",\"employeeId\":\"789-33-3887\",\"name\":\"Paolo Ledner\",\"phonenumber\":\"757.910.0396\",\"beer\":\"Sierra Nevada Bigfoot Barleywine Style Ale\",\"company\":\"Schmidt LLC\",\"address\":\"{\\\"street\\\":\\\"Coralie Trafficway\\\",\\\"zipcode\\\":\\\"12291\\\"}\"}";
  • Теперь я прочитал мой первый объект JSON:
Gson g = new Gson();
JsonElement jelem = g.fromJson(payload,JsonElement.class);
JsonObject jobj = jelem.getAsJsonObject();

Это правильно возвращает объект Json, но я не могу прочитать ключи из вложенного поля address, тогда мне нужно прочитать содержимое этого поля, превратить его в строку и, в соответствии с моей логикой, затем применить тот же подход чтобы получить формат Json и прочитать нужные мне ключи, вот этот шаг:

String address = jobj.get("address").toString().substring(1,jobj.get("address").toString().length()-1);
JsonElement jeaddress = g.fromJson(address, JsonElement.class);
JsonObject jaddress = jeaddress.getAsJsonObject();

System.out.println(jaddress.get("zipcode"));

Вопросы

Строка address возвращает правильно {\"street\":\"Coralie Trafficway\",\"zipcode\":\"12291\"}, но затем, когда я пытаюсь напечатать jaddress.zipcode, я получаю ошибку:

Исключение в теме "main" com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: ожидаемое имя в строке 1 столбец 2 путь $. на com.google.gson.Gson.fromJson (Gson.java:902) на com.google.gson.Gson.fromJson (Gson.java:852) в com.google.gson.Gson.fromJson (Gson.java:801) в com.google.gson.Gson.fromJson (Gson.java:773) в bncingestion.kafkaconsumer.validating_payload (kafkaconsumer.java:29) at bncingestion.kafkaconsumer.main (kafkaconsumer.java:15). Вызывается: com.google.gson.stream.MalformedJsonException: ожидаемое имя в строке 1 столбец 2 путь $. в com.google.gson.stream.JsonReader.syntaxError (JsonReader.java:1559) на com.google.gson.stream.JsonReader.doPeek (JsonReader.java:513) на com.google.gson.stream.JsonReader.hasNext (JsonReader.java:414) в com.google.gson.internal.bind.TypeAdapters $ 29.read (TypeAdapters.java:738) в com.google.gson.internal.bind.TypeAdapters $ 29.read (TypeAdapters.java:714) в com.google.gson.internal.bind.TypeAdapters $ 35 $ 1.read (TypeAdapters.java:910) на com.google.gson.Gson.fromJson (Gson.java:887) ... еще 5

Дополнительная версия этого преобразования без удаления " находится здесь:

String address = jobj.get("address").toString();
JsonElement jeaddress = g.fromJson(address, JsonElement.class);
JsonObject jaddress = jeaddress.getAsJsonObject();
System.out.println(jaddress.get("zipcode"));

В этом случае ошибка:

Исключение в потоке "main" java.lang.IllegalStateException: не JSON Объект: "{\" street \ ": \" Coralie Trafficway ", \" zipcode \ ": \" 12291 \ "}" на com.google.gson.JsonElement.getAsJsonObject (JsonElement.java:90) в bncingestion.kafkaconsumer.validating_payload (kafkaconsumer.java:31) at bncingestion.kafkaconsumer.main (kafkaconsumer.java:15)

Я ценю любую помощь. спасибо

1 Ответ

1 голос
/ 02 мая 2019

Вызов jobj.get("address").toString() форматирует значение (a JsonElement) как JSON, а поскольку значение является строкой, оно добавляет кавычки и экранирует содержимое.Не делайте этого, то есть не вызывайте toString(), явно или неявно, если вы после значения .

Замените строку на String address = jobj.get("address").getAsString();
Также заменитестрока с System.out.println(jaddress.get("zipcode").getAsString());

...