我正在尝试向fsharpx添加基本的JSON类型提供程序。
目前,我正在努力处理JSON数组。考虑以下测试案例:

type SimpleArray = JSON< "{\"items\":[{\"id\":\"Open\"},{\"id\":\"Pause\"}]}">

let a = SimpleArray()

[<Test>]
let ``Can parse simple arrays``() =
    a.items.[0].id
    |> should equal "Open"

    a.items.[1].id
    |> should equal "Pause"

我的想法是我想使用数组中的第一个元素来获取集合元素的类型。然后,我想向SimpleArray类型添加属性“items”,以提供此新类型的列表。

该代码可以在github repo Github中找到。有趣的部分从第38行开始。您可以看到整个事情必须是递归的,因为JArray也可以包含嵌套的JArrays。
| JArray list ->
    let newType = annotateAsJson list.[0] (runtimeType<obj> (ownerTy.Name + "_" + e.Key))
    ownerTy.AddMember newType
    Some(provideProperty
            e.Key
            newType // TODO: make this a list
            (fun args -> Expr.Coerce(<@@ (%%args.[0] : obj) @@>, newType)) // TODO: return the list
            :> MemberInfo)

谢谢,
斯特芬

最佳答案

到底是什么问题?看起来您需要提供多种类型(例如,在您的示例中,外部类型包含items,然后内部类型包含id)。您可能希望内部类型是外部类型内的嵌套类型。然后,使提供的items属性包含内部类型的列表。您遇到问题的某个方面是否存在?

编辑

如果只是想知道如何创建Type实例本身,是否尝试过

typedefof<_ list>.MakeGenericType(newType)

这假定基础值本身就是obj list,这是必需的,因为newType会擦除为obj

关于types - 在F#中创建提供的类型的列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9561653/

10-12 12:39
查看更多