簡體   English   中英

無法將類型反序列化為JToken

[英]Unable to deserialize type into JToken

我無法反序列化JSON的Tags屬性:

{
    "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 }

嘗試反序列化Post值的Tags屬性時遇到異常:

 let settings = JsonSerializerSettings()
 settings.MissingMemberHandling <- MissingMemberHandling.Ignore
 let result = JsonConvert.DeserializeObject<Response>(json, settings)

發生Newtonsoft.Json.JsonSerializationException
HResult = 0x80131500 Message =無法將當前JSON對象(例如{“ name”:“ value”})反序列化為類型'System.Collections.Generic.IEnumerable`1 [Newtonsoft.Json.Linq.JToken]',因為該類型需要一個JSON數組(例如[1,2,3])可正確反序列化。 要解決此錯誤,可以將JSON更改為JSON數組(例如[1,2,3]),也可以更改反序列化類型,使其成為普通的.NET類型(例如,不像整數這樣的原始類型,也不像這樣的集合類型)數組或列表),可以從JSON對象反序列化。 還可以將JsonObjectAttribute添加到類型中,以強制其從JSON對象反序列化。 路徑“ posts [0] .tags.F#”,第1行,位置1582。Source =
StackTrace:在Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(JsonReader reader,Type objectType,JsonContract contract,JsonProperty member,JsonContainerContract containerContract,JsonProperty containerMember,Object existValue)...

附錄:

這是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);

該庫非常明確地告訴您問題所在: Cannot deserialize ... JSON object ... into type 'JToken seq' because the type requires a JSON array to deserialize correctly

Seq是東西的序列(即列表,數組,枚舉)。 它對應於JSON數組,而不是JSON對象。

要在不預先知道屬性名稱的情況下反序列化JSON對象,請使用IDictionary

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

此外,如果您知道每個標簽的形狀( ID + name ),那么您可以做得更好:

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM