java 使用带有变量名的表达式对JSON对象求值

vwkv1x7d  于 2023-01-01  发布在  Java
关注(0)|答案(1)|浏览(104)

我们需要在java中评估json对象表达式
我们有以下源json对象

{
  "model":"abc",
  "variant":"m1",
  "stage":2,
  "a":100,
  "b":200,
  "display name":"${model}-${variant}",
  "c":"${a}*${b}",
  "description":"${model}-${variant}-${stage*10}"
}

在求值之后,JSON对象应该类似于

{
  "model":"abc",
  "variant":"m1",
  "stage":2,
  "a":100,
  "b":200,
  "display name":"abc-m1",
  "c":"300",
  "description":"abc-m1-20"
}

表达式可以有3种类型
1.纯算术表达式
1.连续字符串

  1. concat和算术表达式的组合
    我们对源json中定义表达式表示的任何修改都持开放态度
    此致,Pranav
    我们尝试了https://github.com/json-path/JsonPath,但它更多的是一个过滤json
zc0qhyus

zc0qhyus1#

  • Josson* 的最新版本1.4.2添加了函数eval()。

https://github.com/octomix/josson

Josson josson = Josson.fromJsonString(
    "{" +
    "  \"model\": \"abc\"," +
    "  \"variant\": \"m1\"," +
    "  \"stage\" :2," +
    "  \"a\": 100," +
    "  \"b\": 200," +
    "  \"display name\": \"concat(model,'-',variant)\"," +
    "  \"c\": \"round(calc(a+b),0).toText()\"," +
    "  \"description\": \"concat(model,'-',variant,'-',round(calc(stage*10),0))\"" +
    "}");
JsonNode node = josson.getNode(
    "field(display name: eval(display name)," +
    "      c: eval(c)," +
    "      description: eval(description))");
System.out.println(node.toPrettyString());

产出

{
  "model" : "abc",
  "variant" : "m1",
  "stage" : 2,
  "a" : 100,
  "b" : 200,
  "display name" : "abc-m1",
  "c" : "300",
  "description" : "abc-m1-20"
}

相关问题