2017-11-01 16 views
0

にタイプをデシリアライズすることができません:私はJSONのタグプロパティをデシリアライズすることができませんJToken

{ 
    "posts": [ 
     { 
      "ID": 7096, 
      "title": "Backwards Pipe Operator", 
      "URL": "https://bizmonger.wordpress.com/2017/10/26/backwards-pipe-operator/", 
      "tags": { 
       "F#": { 
        "ID": 6012, 
        "name": "F#" 
         } 
        } 
     } 
    ] 
} 

JSONから、私は次の種類を提供し、上記:

type Post = { 
    title: string 
    URL: string 
    Tags: JToken seq // Used to refer to the string instead of the property type 
} 

type Response = { posts: Post list } 

私はに実行しています

let settings = JsonSerializerSettings() 
settings.MissingMemberHandling <- MissingMemberHandling.Ignore 
let result = JsonConvert.DeserializeObject<Response>(json, settings) 
012: ポスト値の タグプロパティをデシリアライズしようとすると例外

Newtonsoft.Json.JsonSerializationExceptionは
HRESULT = 0x80131500メッセージ=現在のJSON オブジェクトをデシリアライズすることはできません(例えば、発生しましたタイプがJSON配列を必要とするため(たとえば、[1,2,3])、 'System.Collections.Generic.IEnumerable`1 [Newtonsoft.Json.Linq.JToken]' に「{"name": "value" ) を正しく逆シリアル化します。このエラーを修正するには、JSON配列を (例:[1,2,3])に変更するか、デシリアライズされたタイプを通常の の.NETタイプに変更します(たとえば、整数などのプリミティブ型ではなくコレクションJSON オブジェクトからデシリアライズできる配列またはリストのようなタイプの )。 JsonObjectAttributeを型に追加して、 を強制的にJSONオブジェクトから逆シリアル化することもできます。パス 'ポスト[0] .tags.F番号'、行1、 位置1582ソース=
のStackTrace: Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(JsonReader リーダーで、タイプobjectTypeに、JsonContract契約、JsonProperty部材、 JsonContainerContract containerContract、JsonProperty containerMember、 オブジェクトexistingValue)...

付録:

はここでJSON URL

です
try let url =  String.Format(ArticlesUrl, user.AccessId) 
    let response = client.GetAsync(url) |> Async.AwaitTask 
              |> Async.RunSynchronously 
    if response.IsSuccessStatusCode 
    then let json =  response.Content.ReadAsStringAsync() |> Async.AwaitTask 
                  |> Async.RunSynchronously 
     let settings = JsonSerializerSettings() 
     settings.MissingMemberHandling <- MissingMemberHandling.Ignore 

     let result = JsonConvert.DeserializeObject<Response>(json, settings); 

答えて

2

ライブラリでは、何が間違っているかを明示します。Cannot deserialize ... JSON object ... into type 'JToken seq' because the type requires a JSON array to deserialize correctly

Seqは、stuffのシーケンス(つまり、リスト、配列、列挙)です。これはJSON配列に対応し、JSONオブジェクトには対応しません。

IDictionaryを使用し、事前に施設名を知らなくてもJSONオブジェクトをデシリアライズするには:あなたは、個々のタグ(ID + name)の形状を知っている場合

type Post = { 
    title: string 
    URL: string 
    Tags: IDictionary<string, JToken> 
} 

さらに、あなたはより良い行うことができます:

type Tag = { ID: string; name: string } 

type Post = { 
    title: string 
    URL: string 
    Tags: IDictionary<string, Tag> 
} 
関連する問題