所以我有以下F#方法
static member ReadInstagramSearch() =
let data = Http.Request( "https://api.instagram.com/v1/users/search?q=SomeUSer&client_id=someclientid" )
let res = FsUserSearch.Parse(data)
res.Data.[0]
如果我有一个C#控制器,我调用此方法是否仍然在View中使用该结果?我尝试过使用
进行简单访问@Model.FirstName
但这给了我一个例外
'FSharp.Data.RuntimeImplementation.JsonDocument' does not contain a definition for 'FirstName'
我唯一的选择是将JsonDocument转换为强类型的Model对象吗?然后返回那个?
这是用的 http://fsharp.github.io/FSharp.Data/library/JsonProvider.html
我的JsonProvider被定义为
type FsUserSearch = JsonProvider<"""
{
"data": [{
"username": "jack",
"first_name": "Jack",
"profile_picture": "http://distillery.s3.amazonaws.com/profiles/profile_66_75sq.jpg",
"id": "66",
"last_name": "Dorsey"
}]
}""">
答案 0 :(得分:3)
可悲的是,目前不支持此功能。 JSON类型提供程序使用擦除类型,这意味着已解析的文档表示为类型JsonDocument
的值,该值实际上不包含您在F#中可以看到的任何成员。 F#编译器理解这一点,但它们不在编译代码中,而其他语言目前不支持类型提供程序。
有很多方法可以解决这个问题,它肯定在TODO列表中。 (这有点棘手,实现ICustomTypeDescriptor
会在某些情况下起作用,但不会在这里。生成实际类型可能是一种方法。有关更多信息,请参阅this bug at F# Data GitHub page。)
目前,您可以使用JSON库提供的动态访问操作。有关详细信息,请参阅the JSON Parser and Reader page。我认为@Model.FirstName
可以使用:
@Model.GetProperty("FirstName").AsString()
当然不完美 - 但遗憾的是C#不支持类型提供商,所以这可能是最好的选择。另一种解决方法是定义一个简单的F#记录类型,并将您需要的数据转换为一个记录类型,然后您可以从C#中轻松使用它。