JSON.Net无法在自定义JsonConverter中反序列化json数组
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JSON.Net无法在自定义JsonConverter中反序列化json数组相关的知识,希望对你有一定的参考价值。
我遇到了一个我似乎无法解决的令人困惑的问题。
我正在使用Json.Net,我已经编写了一个自定义Json转换器来处理我的应用程序中的特殊情况。我遇到的问题是deserialize或ReadJson
方法,当它厌倦了将JSON数组转换为字符串数组时抛出错误:
错误的确切文本是:Unexpected token while deserializing object: PropertyName. Path 'RootPages', line 1, position 13.
正如您从检查器中看到的那样,它正在尝试反序列化(RootPages)的JProperty已被正确解析并且是有效的JSON。
所以我不完全确定这里发生了什么,任何启蒙都会受到高度赞赏。
如果相关,原始JSON字符串如下:
{
"RootPages": [
"TestItem1",
"TestItem2"
],
"Name": "root"
}
编辑-CODE:
ReadJson方法:
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) {
if (PartialChildPageSerialization) {
var jsonObject = JObject.Load(reader);
var properties = jsonObject.Properties().ToList();
foreach (var property in objectType.GetProperties()) {
var type = property.PropertyType;
object value = null;
if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(ChildPageCollection<>)) {
var collection = Activator.CreateInstance(type);
var deserializedValue = properties.First(p => p.Name == property.Name).ToObject<string[]>();
type.GetMethod("PolulateFromSerializer").Invoke(collection, new object[] {deserializedValue});
value = collection;
}
else {
value = properties.First(p => p.Name == property.Name).ToObject(type);
}
property.SetValue(existingValue, value);
}
return existingValue;
}
return serializer.Deserialize(reader, objectType);
}
ChildPageCollection有趣部分的片段:
public class ChildPageCollection<T> : IList<T> where T : DataPage
{
public string[] GetNames() => _internalNameList.ToArray();
internal void PolulateFromSerializer(string[] names) {
this.Clear();
_internalNameList.AddRange(names);
_hasFullList = false;
}
private void CheckFullList() {
if(!_hasFullList)
throw new InvalidOperationException("Collection has not been fully loaded, and full list is not avialable.");
}
private readonly List<T> _internalList = new List<T>();
private readonly List<string> _internalNameList = new List<string>();
private bool _hasFullList = true;
...
}
我希望这是因为第一个属性是一个具有名为'RootPages'属性的对象,它是一个字符串[]。
不幸的是,从截图的外观来看,您正在尝试将对象转换为字符串数组。
这应该适用于您给出的示例:
properties.First(p => p.Name == property.Name).Select(o => o.Children().Values<string>()).First().ToArray();
取代:
properties.First(p => p.Name == property.Name).ToObject<string[]>();
以上是关于JSON.Net无法在自定义JsonConverter中反序列化json数组的主要内容,如果未能解决你的问题,请参考以下文章
JSON.Net 在使用 [JsonConvert()] 时抛出 ***Exception
检测反序列化的对象是不是缺少 Json.NET 中 JsonConvert 类的字段
如何在 Json.Net 中的 JsonConvert DeserializeObject 之后获取所有不存在的键?
C# 使用Json.NET对数据进行序列化和反序列化 | c# json serialize and deserialize using json.net JsonConvert