我正在尝试向fsharpx添加基本的JSON类型提供程序。 目前我正在使用JSON Arrays。请考虑以下测试用例:
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)
谢谢, 斯特芬
答案 0 :(得分:3)
究竟是什么问题?看起来您需要提供多种类型(例如,在您的示例中,您的外部类型包含items
,然后是包含id
的内部类型)。您可能希望内部类型是外部类型中的嵌套类型。然后,您将提供的items
属性包含内部类型的列表。你遇到麻烦的那个方面有哪些方面?
修改强>
如果您只想知道如何创建Type
实例,请尝试
typedefof<_ list>.MakeGenericType(newType)
这假设它本身的基础值为obj list
,这是newType
删除obj
后必需的。