2013-06-30 20 views
1

所以我有以下的F#方法您是否可以将解析的JSONProvider结果作为Model对象返回以在MVC视图中使用?

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" 
    }] 
}"""> 

回答

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#。

+0

好的,这就是我的想法。我正在学习F#的过程中,所以很好奇,如果有一个功能,我不知道..我尝试了一点扩展方法和C#真的不喜欢他们。我添加了一个使用“FSharp.Data.Json.Extensions”,它抱怨在FSharp.Data.DesignTime和FSharp.Data dll中都引用了该DLL。该扩展从F#中正常工作,但不在C#中。所以我可能会去记录类型,但我希望是懒惰的:-)但我想我的新F#的知识,我可以使他们现在更快,更少的仪式。感谢您的快速回复! –

+0

我认为记录是最简单的选择...至于DLL,C#部分应该只需要'FSharp.Data.dll'(“DesignTime”仅用于类型提供程序,并且不应该在C#项目中需要 - 但也许Visual Studio将它复制到那里,这可能会以某种方式混淆ASP.NET ...) –

+0

是的,当我添加它的时候它与nuget包一起出现......没有它就很好地编译。记录效果很好,我也使用了JsonToXML F#示例,这些示例很好地将JSON数据转换为XML数据,我可以将这些数据存储到XML字段中,以便这样做:-) –

相关问题