2017-03-15 17 views
2

JSONファイルの欠損データを処理するにはどうすればよいですか?データのリストでは、単にマップ関数を使うことができます。F#JSONデータが欠落しているとtypeproviderがクラッシュする

{ 
    "Person":{ 
    "FirstName":"John", 
    "LastName":"Doe", 
    "Age": 42, 
    "Address": { 
     "Street": "SomeStreet", 
     "City" : "Some City" 
     } 
    } 
} 

そして、私の実際のデータのような入って来:

{ 
    "Person":{ 
    "FirstName":"John", 
    "Age": 42 
    } 
} 

私はアドレスをオプションにする方法を見つけ出すことはできませんが、オブジェクトに関する

は、私はサンプルデータを持っているものを言います。

type personJson = JsonProvider<"Data/personSample.json"> 
let personData = testJson.Load("Data/personData.json") 

let address = personData.Person.Addres // gives an exception 

はまた、オプションにそれを変換しようとすると、P = personData.Personを聞かせて 失敗します.Address |> Option.ofObj

タイプ 'JsonProvider < ...'タイプのアドレスが '2'で適切な値として 'null'を持っていないため、 35

一部のデータが欠落しているファイルごとにコードを変更する必要があるとは思いません。

これを解決するにはどうすればよいですか?

+1

[任意のプロパティを持つJSONタイププロバイダのデータサンプル](0120-17752)の可能な複製。 –

+0

簡単な答えは 'SampleIsList'を' true'に設定し、すべての可能な形のjsonオブジェクトのリストを与えることです。 –

+0

私の場合、SampleIsListが機能しないという印象があります。私の質問で述べたように、私はリストではなく、ただ1つのオブジェクトで動作します。 SampleIsListを追加した後も、Addressオブジェクトを要求すると例外が発生します。System.Exception: '/ Person'に{'FirstName ":" John "、" Age ":42、" Address " null} – jtourlamain

答えて

5

タイププロバイダの設定時に、SampleIsList = trueを使用して、オブジェクトの形状に関する複数のバリエーションを提供できます。 、あなたは、単一のpersonData例をロードする今

[ 
    { 
     "Person":{ 
      "FirstName":"John", 
      "LastName":"Doe", 
      "Age": 42, 
      "Address": { 
       "Street": "SomeStreet", 
       "City" : "Some City" 
       } 
     } 
    }, 
    { 
     "Person":{ 
      "FirstName":"John", 
      "LastName":"Doe", 
      "Age": 42 
     } 
    } 
] 

personsSample.json

open FSharp.Data 

type personJson = JsonProvider<"Data/personsSample.json", SampleIsList = true> 

let personData = personJson.Load("Data/personData.json") 

内容はアドレスせずに、元のJSONとそのJSONの変化の両方が含まれ、このようになります。アドレスフィールドを参照すると、クラッシュする代わりにヌル値が正しく処理されます。

+1

テストセットに複数のオブジェクトを追加できるかどうかはわかりませんでした。今度は値を取得します:Option .Address> = None - >例外なしでデータをチェックできます。チャドギルバートありがとう! – jtourlamain

関連する問題