如何根据属性值过滤json的元素
How to filter elements of json based on attribute values
我有一个 json 架构,其中包含许多具有属性 "image" 的元素。
"passportPhoto": {
"description": "Passport photo",
"type": "string",
"image": {
"binaryEncoding": "base64"
}
},
实际 json 如下所示
"passportPhoto": "photo in base 64 encoded string format",
是否可以根据属性 "image" 过滤架构并获取 json 路径格式
中所有元素的列表
$.a.b.c.passportPhoto
我必须使用 json 路径读取 json,然后对照片进行一些处理,例如将其序列化。 但我的问题是关于如何在 Java 系统中根据 "image" 属性 过滤架构。
为此,您可以使用 Jayway JsonPath 库。它允许找到给定 属性 的路径。当您找到所有路径时,您可以为它们提取值。描述 JSON
的 JSON Schema
也是一个有效的 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
另请参阅:
我有一个 json 架构,其中包含许多具有属性 "image" 的元素。
"passportPhoto": {
"description": "Passport photo",
"type": "string",
"image": {
"binaryEncoding": "base64"
}
},
实际 json 如下所示
"passportPhoto": "photo in base 64 encoded string format",
是否可以根据属性 "image" 过滤架构并获取 json 路径格式
中所有元素的列表$.a.b.c.passportPhoto
我必须使用 json 路径读取 json,然后对照片进行一些处理,例如将其序列化。 但我的问题是关于如何在 Java 系统中根据 "image" 属性 过滤架构。
为此,您可以使用 Jayway JsonPath 库。它允许找到给定 属性 的路径。当您找到所有路径时,您可以为它们提取值。描述 JSON
的 JSON Schema
也是一个有效的 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
另请参阅: