Как фильтровать элементы json по значениям атрибутов - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть схема JSON со многими элементами с атрибутом «изображение».

  "passportPhoto": {
    "description": "Passport photo",
    "type": "string",
    "image": {
      "binaryEncoding": "base64"
    }
  },

и фактический json выглядит следующим образом

  "passportPhoto": "photo in base 64 encoded string format",

Можно ли фильтровать схему на основе атрибута "image" и получить список всех элементов в формате jsonpath

$.a.b.c.passportPhoto

Я должен прочитать json, используя путь json, а затем сделать что-то с фотографией, например, сериализовать ее., но мой вопрос о том, как отфильтровать схему на основе атрибута "image" в системе Java.

1 Ответ

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

Для этого вы можете использовать библиотеку Jayway JsonPath .Это позволяет найти пути для данного свойства.Когда вы найдете все пути, вы можете извлечь значения для них.JSON Schema, который описывает JSON, также является допустимым JSON, поэтому, во-первых, вы можете извлечь все свойства из JSON Schema, а после этого процесса получить JSON полезную нагрузку.В приведенном ниже примере я использую предопределенный список свойств.

Для заданной JSON полезной нагрузки (предположим, что все *photo свойства описаны в схеме как изображения):

{
  "map": {
    "photo": "map photo"
  },
  "person": {
    "data": {
      "photos": {
        "photo": "photo Base64",
        "passportPhoto": "passport photo Base64"
      }
    }
  }
}

Ниже приведен пример:

import com.jayway.jsonpath.EvaluationListener;
import com.jayway.jsonpath.JsonPath;
import com.jayway.jsonpath.ReadContext;

import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class JsonPathApp {
    public static void main(String[] args) throws Exception {
        File jsonFile = new File("./resource/test.json").getAbsoluteFile();

        List<String> paths = new ArrayList<>();
        ReadContext findPathsContext = JsonPath.parse(jsonFile).withListeners((found) -> {
            paths.add(found.path());
            return EvaluationListener.EvaluationContinuation.CONTINUE;
        });

        List<String> properties = Arrays.asList("photo", "passportPhoto");
        properties.forEach(p -> findPathsContext.read("$.." + p));

        ReadContext readContext = JsonPath.parse(jsonFile);

        for (String path : paths) {
            System.out.println("Path: " + path);
            System.out.println("Value: " + readContext.read(path));
        }
    }
}

Отпечатки:

Path: $['map']['photo']
Value: map photo
Path: $['person']['data']['photos']['photo']
Value: photo Base64
Path: $['person']['data']['photos']['passportPhoto']
Value: passport photo Base64

См. Также:

  1. Jsonpath с Джексоном или Гсоном
  2. Json Path Maven
...