阅读完一些示例后,可以通过Yojson.Basic.from_string
或from_channel
轻松构建JSON对象。
另一方面,我们也可以通过pretty_to_string
轻松地将JSON对象转换为字符串。
但是,update
JSON对象很棘手,例如输入参数如下:
{
"content": "test content",
"base" : {
"version": 1,
"id" : "a001"
}
}
我想更新其中的"id"
并返回一个新的JSON对象:
{
"content": "test content",
"base" : {
"version": 1,
"id" : "a002"
}
}
我尝试编写一个函数来更新JSON对象:
let update_json (js: json) (key: string) (new_value: string) : json =
let rec aux (json_ele:json):json =
match json_ele with
| `Bool b -> `Bool b
| `Float f -> `Float f
| `Int i -> `Int i
| `List jl -> `List (List.map jl ~f:aux)
| `Null -> `Null
| `String st -> `String st
| `Assoc kvlist ->
`Assoc (
List.map
kvlist
~f:(fun (okey, ovalue) ->
match ovalue with
| `String v when okey = key -> (okey, `String new_value)
| _ -> (okey, aux ovalue)))
in
aux js
我想知道编写上述函数是否是更新Yojson中JSON对象的最佳方法?
答案 0 :(得分:1)
我不清楚“错误”是什么意思,但`Assoc
不接受string * json
,需要(string * json) list
。这意味着,在`Assoc
个案例中,您应该执行List.map
:
| `Assoc pairs ->
List.map pairs ~f:(fun (okey, ovalue) ->
if okey = key then
key, new_value
else
okey, aux ovalue)
您可能希望将此功能考虑在内并为其命名。