我正在尝试向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/