1

所以我有以下 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# 控制器,是否可以在视图中使用该结果?我试过简单的访问

@Model.FirstName

但这给了我一个例外

'FSharp.Data.RuntimeImplementation.JsonDocument' does not contain a definition for 'FirstName'

将 JsonDocument 转换为强类型模型对象是我唯一的选择吗?然后返回那个?

这是使用 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"
    }]
}""">
4

1 回答 1

4

遗憾的是,目前不支持此功能。JSON 类型提供程序使用已擦除类型,这意味着已解析的文档表示为类型的值,该类型JsonDocument实际上没有任何您可以在 F# 中看到的成员。F# 编译器理解这一点,但它们不存在于编译代码中,并且其他语言目前不支持类型提供程序。

有很多方法可以解决这个问题,它肯定在 TODO 列表中。(这有点棘手,ICustomTypeDescriptor在某些情况下实现会起作用,但在这里不行。生成实际类型可能是一种前进的方式。有关更多信息,请参阅F# Data GitHub 页面上的这个错误。)

目前,您可能能够使用 JSON 库提供的动态访问操作。有关更多详细信息,请参阅JSON 解析器和读取器页面。我认为@Model.FirstName可以使用:

@Model.GetProperty("FirstName").AsString()

当然不完美 - 但遗憾的是 C# 不支持类型提供程序,所以这可能是最好的选择。另一种解决方法是定义一个简单的 F# 记录类型并将您需要的数据转换为您可以从 C# 轻松使用的记录类型。

于 2013-07-01T00:36:32.010 回答