dks*_*551 2 java json jsonpath jackson jackson-databind
要求:
我想对JsonNode. 功能可以不同,例如:-lowercasing某些值或将某些内容附加到这些值或用某些内容替换这些值。如何使用Jackson库实现这一目标?请注意,JSON 数据的结构可能不同,这意味着我想构建一个通用系统,该系统将接受一些路径表达式,这将基本上决定在哪里更改。我想使用函数式编程风格,以便我可以将这些函数作为参数传递。
例如:
输入:
{
"name": "xyz",
"values": [
{
"id": "xyz1",
"sal": "1234",
"addresses": [
{
"id": "add1",
"name": "ABCD",
"dist": "123"
},
{
"id": "add2",
"name": "abcd3",
"dist": "345"
}
]
},
{
"id": "xyz2",
"sal": "3456",
"addresses": [
{
"id": "add1",
"name": "abcd",
"dist": "123"
},
{
"id": "add2",
"name": "XXXXX",
"dist": "345"
}
]
}
]
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我基本上必须使用两个函数,lowercase()并且convert_to_number(). 我想申请lowercase()上的所有函数"name"内的所有属性"addresses"每个"value"。同样适用于convert_to_number(),但适用于所有"dist"属性。
因此,基本上JSON函数的表达式如下所示:
lowercase() : /values/*/addresses/*/name
convert_to_number() : /values/*/addresses/*/dist
Run Code Online (Sandbox Code Playgroud)
输出:
{
"name": "xyz",
"values": [
{
"id": "xyz1",
"sal": "1234",
"addresses": [
{
"id": "add1",
"name": "abcd",
"dist": 123
},
{
"id": "add2",
"name": "abcd3",
"dist": 345
}
]
},
{
"id": "xyz2",
"sal": "3456",
"addresses": [
{
"id": "add1",
"name": "abcd",
"dist": 123
},
{
"id": "add2",
"name": "xxxx",
"dist": 345
}
]
}
]
}
Run Code Online (Sandbox Code Playgroud)
客户端代码:
JsonNode jsonNode = ...
applyFunctionsRecursivelyBasedOnExpr(JsonNode jsonNode, String expr, Function )
Run Code Online (Sandbox Code Playgroud)
正如@MichalZiober 在他的回答中已经指出的那样,当您需要执行基于 JSON 路径的操作时, JsonPath提供了比 Jackson 更强大的 API。
使用方法JsonPath.parse,WriteContext.map
您只需几行就可以解决您的问题:
import java.io.File;
import com.jayway.jsonpath.Configuration;
import com.jayway.jsonpath.JsonPath;
public class Main {
public static void main(String[] args) throws Exception {
File file = new File("input.json");
String json = JsonPath.parse(file)
.map("$.values[*].addresses[*].name", Main::lowerCase)
.map("$.values[*].addresses[*].dist", Main::convertToNumber)
.jsonString();
System.out.println(json);
}
private static Object lowerCase(Object currentValue, Configuration configuration) {
if (currentValue instanceof String)
return ((String)currentValue).toLowerCase();
return currentValue;
}
private static Object convertToNumber(Object currentValue, Configuration configuration) {
if (currentValue instanceof String)
return Integer.valueOf((String)currentValue);
return currentValue;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4335 次 |
| 最近记录: |