您可以将解析后的JSONProvider结果作为Model对象返回,以便在MVC视图中使用吗?

时间:2013-06-30 23:30:25

标签: f# type-providers f#-data

所以我有以下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"
    }]
}""">

1 个答案:

答案 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#中轻松使用它。