2013-06-30 1 views
1

Поэтому у меня есть следующий метод F #Можете ли вы вернуть обработанный результат JSONProvider в качестве объекта модели для использования в представлении 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, что я называю этот метод с есть в любом случае использовать этот результат в представлении? Я пробовал только простой доступ с

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

ответ

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», и он жаловался на то, что DLL ссылается как в файлах FSharp.Data.DesignTime, так и в файлах FSharp.Data. Это расширение отлично работает с F #, но не на стороне C#. Поэтому я, вероятно, займу тип записи, но я надеялся быть ленивым :-) Но я думаю, что благодаря своим новым знаниям F # я могу сделать их быстрее и с меньшими церемониями. Спасибо за быстрый ответ!!! –

+0

Я думаю, что записи - это самый простой вариант ... Что касается DLL, для части C# должен быть нужен только 'FSharp.Data.dll' (' DesignTime' предназначен только для поставщиков типов и вообще не нужен в проекте C# - но, возможно, Visual Studio копирует его там, что может каким-то образом запутать ASP.NET ...) –

+0

Да, он появился вместе с пакетом nuget, когда я добавил его таким образом ... Компилирует без него. Записи оказались хорошо работать, и я также использовал ваши образцы J # JsonToXML F #, которые отлично поработали для преобразования данных JSON в XML-данные, которые я мог бы хранить в XML-полях, поэтому yay для этого :-) –