Search code examples
jsonocaml

How to remove a member from a JSON object using YoJson?


I am trying to functionally remove a member of a Yojson.Safe.t.

For example:

{
  id: 123,
  name: "bob",
  roles: ["admin", "user"]
}

If I was to remove the id member, the result would look like:

{
  name: "bob",
  roles: ["admin", "user"]
}

I originally thought that something like this would do it:

Yojson.Safe.Util.to_assoc json 
|> List.filter (fun (t, _) -> t != "id")
|> fun t -> `Assoc t

But for some reason it keeps the member anyways. How can I remove a member from a Yojson.Safe.t?


Solution

  • Don't use != to compare strings! Use <>:

    # "abc" != "abc";;
    - : bool = true
    # "abc" <> "abc";;
    - : bool = false
    

    The != operator is "physical inequality", i.e., the inverse of the == operator. These are not for general use, especially not on immutable values.

    The workhorse operators for comparison are = and <>.