2013-06-30 75 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字段中,以便這樣做:-) –

相關問題