Джексон - разобрать JSON с помощью xpath или аналогичного - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть некоторый json, и он довольно сложный - (слишком сложный и открытый для моделирования с использованием чего-то вроде gson), и мне нужно извлечь строковые значения из определенных узлов в список строк.

Следующий код работает, но из-за того, как работает мой json - он захватывает много лишних вещей, которые мне не нужны (примечание: у меня нет схемы json)

ObjectMapper mapper = new ObjectMapper();
        JsonNode node = mapper.readTree(json);
        List<JsonNode> keys = node.findValues("key") ;
for(JsonNode key: keys){
         System.out.println(key.toString());
}

Содержимое Json довольно сложное (экспорт фильтра Jira), которое выглядит следующим образом:

{
    "issues": [
    {
        "key":"MIN-123",
        ...
        "fields":{
             "key":"A_Elric"
        }
    }
    ]
}

Утверждения: я всегда хочу извлекать проблемы [x] .key, а не какие-либо подключи.Я бы предпочел извлечь это в список, но любая нормальная структура данных в порядке.Я уже использую Джексона - но gson - это тоже вариант, если есть разумный способ сделать это.

Спасибо за помощь!

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

JsonPath является xpath для json и имеет реализацию Java .Вот рабочий пример получения ключей выдачи без подключей:

import com.jayway.jsonpath.Configuration;
import com.jayway.jsonpath.JsonPath;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;

public class JsonPathTest {

    public static String ROOT_ARRAY = "issues";
    public static String KEY = "key";
    // get all KEYs right under ROOT array
    public static String jsonPath = String.format("$.%s[*].%s", ROOT_ARRAY, KEY);

    public static void main(String[] args) {
        try {
            String jsonStr = new String(Files.readAllBytes(Paths.get("c:/temp/xx.json")));
            Object jsonObj = Configuration.defaultConfiguration().jsonProvider().parse(jsonStr);
            List<String> keys = JsonPath.parse(jsonObj).read(jsonPath);
            System.out.println(keys);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
0 голосов
/ 26 сентября 2018
public class ExportFilter{
    private static final String KEY = "key";
    private List<Map<String,Object>> issues = new ArrayList<>();

    //getters and setters

    @JsonIgnore
    public List<String> getKeys(){
         return issues.stream()
                .map(issue-> issue.get(KEY))
                .filter(Objects::nonNull)
                .map(Objects::toString)
                .collect(toList());
    }

 }

Пример использования:

 ObjectMapper objectMapper = new ObjectMapper();
 List<String> keys = objectMapper.readValue( .., ExportFilter.class).getKeys();
...