无法反序列化JSON(当期望单个值时获取值数组)

时间:2019-05-30 10:55:25

标签: c# json.net deserialization

我正在从图形数据库中读取数据,并将响应作为动态对象获取。我仔细查看了结果,然后尝试对它们进行反序列化:

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)   ...

我猜这是因为这些值位于数组中,但是每个键只能有一个值。

有什么解决方法吗?

1 个答案:

答案 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; }
}