如何使用Yojson更新JSON对象?

时间:2016-05-16 09:18:54

标签: ocaml

阅读完一些示例后,可以通过Yojson.Basic.from_stringfrom_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对象的最佳方法?

1 个答案:

答案 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)

您可能希望将此功能考虑在内并为其命名。