我正在从图形数据库中读取数据,并将响应作为动态对象获取。我仔细查看了结果,然后尝试对它们进行反序列化:
var e = results.GetEnumerator();
while (e.MoveNext())
{
var serialized = JsonConvert.SerializeObject(e.Current);
// {"FlagCalculateclientside":[false],"Description":["Some detailed info"], "Name": ["MyDetailedEntity"]}
var val = JsonConvert.DeserializeObject<MyObject>(serialized);
}
public class MyObject
{
public bool FlagCalculateclientside { get; set; }
public string Description { get; set; }
public string Name { get; set; }
}
但是出现以下错误:
Newtonsoft.Json.JsonReaderException:解析值时遇到意外字符:[。路径“ FlagCalculateclientside”,第1行,位置28。 在Newtonsoft.Json.JsonTextReader.ReadAsBoolean() 在Newtonsoft.Json.JsonReader.ReadForType(JsonContract合同,布尔hasConverter) ...
我猜这是因为这些值位于数组中,但是每个键只能有一个值。
有什么解决方法吗?
答案 0 :(得分:1)
您的模型与您的JSON不匹配,所有属性都是数组,换句话说,它们被[...]
包围。要修复,请将模型更改为此:
public class MyObject
{
public List<bool> FlagCalculateclientside { get; set; }
public List<string> Description { get; set; }
public List<string> Name { get; set; }
}
一种替代方法是使用自定义转换器,例如:
public class ArrayConverter<T> : JsonConverter<T>
{
public override T ReadJson(JsonReader reader, Type objectType, T existingValue, bool hasExistingValue, JsonSerializer serializer)
{
JToken token = JToken.Load(reader);
//This isn't the best code but shows you what you need to do.
return token.ToObject<List<T>>().First();
}
public override void WriteJson(JsonWriter writer, T value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
并将模型更改为此:
public class MyObject
{
[JsonConverter(typeof(ArrayConverter<bool>))]
public bool FlagCalculateclientside { get; set; }
[JsonConverter(typeof(ArrayConverter<string>))]
public string Description { get; set; }
[JsonConverter(typeof(ArrayConverter<string>))]
public string Name { get; set; }
}