2012-03-05 4 views
3

fsharpxに基本JSON型プロバイダを追加しようとしています。 現時点で私はJSON配列で苦労しています。次のテストケースを考えてみましょう:F#で提供される型のリストを作成

type SimpleArray = JSON< "{\"items\":[{\"id\":\"Open\"},{\"id\":\"Pause\"}]}"> 

let a = SimpleArray() 

[<Test>] 
let ``Can parse simple arrays``() = 
    a.items.[0].id 
    |> should equal "Open" 

    a.items.[1].id 
    |> should equal "Pause" 

アイデアは、私はコレクション要素のタイプを取得するには、配列の最初の要素を使用したいということです。次に、この新しい型のリストを与えるSimpleArray型に "items"というプロパティを追加します。

コードはgithub repo Githubにあります。興味深い部分は38行目から始まります。JArrayにはネストされたJArraysも含まれる可能性があるため、全体を再帰的に表示する必要があります。

| JArray list -> 
    let newType = annotateAsJson list.[0] (runtimeType<obj> (ownerTy.Name + "_" + e.Key)) 
    ownerTy.AddMember newType 
    Some(provideProperty 
      e.Key 
      newType // TODO: make this a list 
      (fun args -> Expr.Coerce(<@@ (%%args.[0] : obj) @@>, newType)) // TODO: return the list 
      :> MemberInfo) 

おかげで、 ステファン

答えて

3

は正確に、質問は何ですか?複数のタイプを指定する必要があるようです(例:itemsを含む外部タイプとidを含む内部タイプ)。おそらく、内部型は外部型内の入れ子型になりたいと思うでしょう。次に、提供されたitemsプロパティに内部型のリストが含まれるようにします。あなたが問題を抱えていることの特定の側面はありますか?

EDIT

それはあなたがTypeインスタンス自体を作成する方法を不思議に思っていることだけだ場合、あなたはこれが必要であるという根本的な価値、それ自体obj listを、前提

typedefof<_ list>.MakeGenericType(newType) 

を試してみましたnewTypeobjに消去されているためです。

+0

ありがとうございました。タイプは今修正されているようです。しかし、私はまだリストを返すのに困っている。私は文字列からFSharpListにInvalidCastExceptionを取得しています。 – forki23

+0

@ forki23 - あなたは 'JArray list'とパターンマッチングしていて、プロパティの定義に決して' list'を使わないようです。おそらく、 'args。[0]'の代わりに 'list'を使って、あなたが作っている式に? – kvb

+0

それは本当に奇妙です。私がこれを置き換えたとしても、私はまだそれを働かせません。私はここで何かを逃している。 – forki23

関連する問題