gpt4 book ai didi

json - Lift-json 操作 - 添加到正确的位置

转载 作者:行者123 更新时间:2023-12-04 11:07:50 24 4
gpt4 key购买 nike

考虑以下json:

{
"type":"A1",
"system":{
"path":"/example.org/FooBar",
"lastModified":"2013-10-01T12:00:00Z"
},
"fields":{
"foo1":["bar1"],
"foo2":["bar2"],
"foo3":["bar3"]
}
}

现在,使用lift-json,我想将此json更改为:
{
"type":"A1",
"system":{
"path":"/example.org/FooBar",
"lastModified":"2013-10-01T12:00:00Z"
},
"fields":{
"foo1":["bar1"],
"foo2":["bar2"],
"foo3":["bar3"]
},
"injected":{
"bar1":"foo1",
"bar2":"foo2"
}
}

所以,我尝试了以下方法:
scala> val json = parse("""
|{
| "type":"A1",
| "system":{
| "path":"/example.org/FooBar",
| "lastModified":"2013-10-01T12:00:00Z"
| },
| "fields":{
| "foo1":["bar1"],
| "foo2":["bar2"],
| "foo3":["bar3"]
| }
|}""")

json: net.liftweb.json.JValue = JObject(List(JField(type,JString(A1)), JField(system,JObject(List(JField(path,JString(/example.org/FooBar)), JField(lastModified,JString(2013-10-01T12:00:00Z))))), JField(fields,JObject(List(JField(foo1,JArray(List(JString(bar1)))), JField(foo2,JArray(List(JString(bar2)))), JField(foo3,JArray(List(JString(bar3)))))))))

scala> json transform{case JObject(l) => JObject(l ::: List(JField("injected", ("bar1" -> "foo1") ~ ("bar2" -> "foo2"))))}
res0: net.liftweb.json.JsonAST.JValue = JObject(List(JField(type,JString(A1)), JField(system,JObject(List(JField(path,JString(/example.org/FooBar)), JField(lastModified,JString(2013-10-01T12:00:00Z)), JField(injected,JObject(List(JField(bar1,JString(foo1)), JField(bar2,JString(foo2)))))))), JField(fields,JObject(List(JField(foo1,JArray(List(JString(bar1)))), JField(foo2,JArray(List(JString(bar2)))), JField(foo3,JArray(List(JString(bar3)))), JField(injected,JObject(List(JField(bar1,JString(foo1)), JField(bar2,JString(foo2)))))))), JField(injected,JObject(List(JField(bar1,JString(foo1)), JField(bar2,JString(foo2)))))))

scala> Printer.pretty(render(res0))
res1: String =
{
"type":"A1",
"system":{
"path":"/example.org/FooBar",
"lastModified":"2013-10-01T12:00:00Z",
"injected":{
"bar1":"foo1",
"bar2":"foo2"
}
},
"fields":{
"foo1":["bar1"],
"foo2":["bar2"],
"foo3":["bar3"],
"injected":{
"bar1":"foo1",
"bar2":"foo2"
}
},
"injected":{
"bar1":"foo1",
"bar2":"foo2"
}
}

如您所见, injected部分,被添加到 fields & system以及。
我只是想在根下添加一次。

那么,我做错了什么?以及如何将 json 转换为我需要的正确结构?

最佳答案

您遇到的问题是,transform 中定义的部分函数在 json 结构中的所有可能级别都匹配。由于外部 JObject 的“系统”和“字段”组件本身就是 JObject,因此它们匹配偏函数,并且也会被转换。

为了获得您正在寻求的结果,您需要使匹配更加具体,例如:

json transform {case JObject(fields) if (fields contains JField("type", "A1")) =>
JObject(l ::: ...

使用一些关于最外层对象的独特信息(这里,它的“类型”设置为“A1”)。

或者,lift json 具有我尚未处理的合并功能,但它可能会提供您想要的:
json merge JObject(JField("injected", ...) :: Nil)

关于json - Lift-json 操作 - 添加到正确的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19115471/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com