2013-06-30 2 views
1

그래서 나는 다음과 같은 F 번호 방법파싱 된 JSONProvider 결과를 Model 객체로 반환하여 MVC 뷰에서 사용할 수 있습니까? 내가보기에 그 결과를 사용하는 어쨌든이이 메서드를 호출 C#을 컨트롤러가있는 경우

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] 

있나요? 나는

@Model.FirstName 

와 단순한 접근 시도했다 그러나 그것은 나에게 예외를 제공

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

강력한 형식의 모델 객체로 JsonDocument 것을 설정하는 내 유일한 옵션인가? 그리고 그걸 돌려 주겠습니까?

http://fsharp.github.io/FSharp.Data/library/JsonProvider.html

을 사용하고

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

는 슬프게도,이 순간에 지원되지 않으므로 내 JsonProvider 정의됩니다. JSON 유형 공급자는 지우기 유형을 사용합니다. 즉, 구문 분석 된 문서는 실제로 F #에서 볼 수있는 멤버가없는 JsonDocument 유형의 값으로 표시됩니다. F # 컴파일러는이를 이해하지만 컴파일 된 코드에는 존재하지 않으며 다른 언어는 현재 유형 공급자를 지원하지 않습니다.

이 문제를 해결하는 데는 여러 가지 방법이 있으며 그것은 TODO 목록에 있습니다. (다소 까다 롭습니다 만, 어떤 시나리오에서는 ICustomTypeDescriptor을 구현하는 것이 좋지만 여기서는 그렇지 않습니다. 실제 유형을 생성하는 것이 최선의 방법 일 수 있습니다. 자세한 내용은 this bug at F# Data GitHub page을 참조하십시오.)

지금은 JSON 라이브러리가 제공하는 동적 액세스 조작. 자세한 내용은 the JSON Parser and Reader page을 참조하십시오. 물론

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

완벽하지 -하지만 슬프게도 C#을 입력 공급자를 지원하지 않기 때문에이 방법이 가장 좋습니다 : 나는 @Model.FirstName을 사용하여 수행 할 수 있다고 생각. 또 다른 해결 방법은 단순한 F # 레코드 유형을 정의하고 필요한 데이터를 C#에서 쉽게 사용할 수있는 레코드 유형으로 변환하는 것입니다.

+0

그게 내가 생각한 것입니다. 나는 F #을 배우는 과정에 있는데, 내가 모르고있는 기능이 있다면 궁금했다. 나는 약간의 확장 방법을 시도해 보았고, C#은 정말로 그들을 좋아하지 않았다. "FSharp.Data.Json.Extensions"를 사용하여 추가 및 FSharp.Data.DesignTime 및 FSharp.Data dlls 참조되는 DLL에 대한 불만. 그 확장은 F #에서 잘 작동하지만 C#에서는 작동하지 않습니다. 그래서 나는 아마 레코드 타입으로 갈 것이지만 나는 게으르기를 바랬습니다 :-)하지만 나는 새로운 F # 지식으로 더 빨리 그리고 더 적은 의식으로 그들을 만들 수 있다고 생각합니다. 빠른 답장을 보내 주셔서 감사합니다 !!! –

+0

필자는 레코드가 가장 쉬운 옵션이라고 생각합니다 ... DLL의 경우 C# 부분에는 FSharp.Data.dll 만 필요합니다 ('DesignTime'은 유형 공급자를위한 것이며 C# 프로젝트에 전혀 필요하지 않아야합니다 -하지만 Visual Studio에서 복사하기 때문에 ASP.NET을 혼란스럽게 할 수 있습니다 ...) –

+0

그런 식으로 추가했을 때 누그 패키지와 함께 제공되는 것은 맞습니다 ... 컴파일하지 않고 멋지게 컴파일합니다. 레코드가 잘 작동하는 것으로 밝혀졌으며 JSON 데이터를 XML 필드로 변환하기 위해 실제로 JSON 데이터를 XML 필드로 변환하기 위해 정말 멋지게 작업 한 JsonToXML F # 샘플을 사용했습니다. 예 :-) –