2017-03-15 3 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 유형 공급자의 데이터 샘플] 가능한 중복 (http://stackoverflow.com/questions/28978716/data-sample-for-json-type-provider-with-optional-property) –

+0

짧은 대답은'SampleIsList'를'true'로 설정하고 모든 가능한 모양의 json 객체 목록을 제공하는 것입니다. –

+0

필자의 경우 SampleIsList가 작동하지 않는다는 인상을 받았습니다. 내 질문에 언급했듯이, 나는 목록으로 일하지 않고, 단지 1 개의 객체로 작업한다. SampleIsList를 추가 한 후에도 Address 객체를 요청하면 예외가 발생합니다. System.Exception : '/ Person'에 'Address'속성이 없습니다. { "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의 변화를 모두 포함하는 다음과 같을 수 있습니다 주소 필드를 참조하면 충돌 대신 Null 값을 올바르게 처리합니다.

+1

테스트 세트에 여러 객체를 추가 할 수 있는지 알지 못했습니다 (하나는 주소와 하나는 포함하지 않음). 이제 저는 값을 얻었습니다 : Option .Address> = None -> 예외없이 데이터를 검사 할 수 있습니다. 차드 길버트에게 감사드립니다. – jtourlamain