Проблема десериализации JSON (получил массив значений, когда ожидалось одно значение) - PullRequest
0 голосов
/ 30 мая 2019

Я читаю данные из графической базы данных и получаю ответ как динамический объект. Я просматриваю результаты и пытаюсь десериализовать их так:

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 Ответ

1 голос
/ 30 мая 2019

Ваша модель не соответствует вашему 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; }
}
...