anchor.diff:            member jm.ToJson (e, o) =
               Map.add eL.Name (eJ.ToJson e) o} : JsonP<'e,'r,'o,'t>
   
  -    static member OptElem (eL: Labelled<option<'e>,'r,'o,'t>, eJ: JsonO<'e>) =
  -      P {new JsonI<option<'e>> () with
  +    static member OptElem (eL: Labelled<option<'e>,'r,'o,'t>, eJ: JsonValue<'e>) =
  +      P {new JsonObj<option<'e>> () with
             member jm.OfJson (o, eO) =
              match Map.tryFind eL.Name o with
               | None -> eO <- None; None
  
positive.code:       {OfJson = function String v -> Choice1Of2 v | _ -> Choice2Of2 "string"
         ToJson = String}
  
      static member Literal () : JsonO<Is<'t>> =
        let name = typeof<'t>.Name
        let nameJ = String name
        {OfJson = function String v when v = name -> Choice1Of2 Is
                         | _ -> Choice2Of2 name
         ToJson = fun Is -> nameJ}
  
      static member Array (tJ: JsonO<'t>) =
        {OfJson = function
          | List js ->
            let n = List.length js
  
negative.code:         lp [] 0
         ToJson = fun t -> pJ.[asC.Tag t].ToJson t}
  
    let toJson<'t> t = generateDFS<Json, JsonValue<'t>>.ToJson t
    let tryOfJson<'t> j = generateDFS<Json, JsonValue<'t>>.OfJson j
    let ofJson<'t> j =
      tryOfJson<'t> j |> Choice.fold id  (failwithf "Expected: %s")
  
  