Значение ключа json является еще одним допустимым значением json. Может ли это значение быть проанализировано как строка вместо анализа внутреннего json как json? - PullRequest
1 голос
/ 23 октября 2019

У меня есть следующий код, который должен анализировать простой json следующим образом:

{"jsonTest":
    {"innerKey":"innerValue"}
}

Здесь значение 'jsonTest' является объектом json. Вопрос: можно ли проанализировать этот JSON (используя Джексона) и получить значение 'jsonTest' в виде простой строки? Другими словами, есть ли способ попросить парсер не анализировать внутренний объект json?

вот что я пробовал до сих пор. Это приводит к исключению синтаксического анализа

 com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.lang.String` out of START_OBJECT token
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;

public class JsonParserTest {

    public static void main(String[] args) throws JsonParseException, JsonMappingException, IOException {
        ObjectMapper mapper = new ObjectMapper();
        String json = "{\"jsonTest\":{\"innerKey\":\"innerValue\"}}";
       TestJson js = mapper.readValue(json, TestJson.class);
       System.out.println(js.getJsonTest());
    }

}

class TestJson {

    private String jsonTest;

    public String getJsonTest() {
        return jsonTest;
    }

    public void setJsonTest(String jsonTest) {
        this.jsonTest = jsonTest;
    }
}

Ответы [ 2 ]

1 голос
/ 23 октября 2019

Вы можете использовать JsonNode для этого. Просто измените ваш класс TestJson:

class TestJson {

    private JsonNode jsonTest;

    public JsonNode getJsonTest() {
        return jsonTest;
    }

    public void setJsonTest(JsonNode jsonTest) {
        this.jsonTest = jsonTest;
    }
}

Вывод:

{"innerKey":"innerValue"}

Также вы можете сделать это, просто используя JsonNode без класса TestJson. Используйте следующий метод mapper.readTree:

 JsonNode jsonNode = mapper.readTree(json);
 System.out.println(jsonNode.get("jsonTest").toString());
0 голосов
/ 23 октября 2019

Вы должны создать структуру для десерализации этого JSON. Это может быть что-то вроде этого:

@Data
@NoArgsConstructor
class TestJson {
    JsonTest jsonTest;
    @Data
    @NoArgsConstructor
    private static class JsonTest {
       String innerKey;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...