[英]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.