如何根据属性值过滤json的元素

问题描述 投票:0回答:1

我有一个json架构,其中包含许多带有属性“image”的元素。

  "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,然后对照片进行序列化操作。但我的问题是如何根据Java系统中的“image”属性过滤模式。

java json jackson jackson2
1个回答
1
投票

要做到这一点,你可以使用Jayway JsonPath库。它允许查找给定属性的路径。找到所有路径后,您可以为它们提取值。描述JSON SchemaJSON也是一个有效的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 with Jackson or Gson
  2. Json Path Maven
© www.soinside.com 2019 - 2024. All rights reserved.