Я читаю данные из базы данных графа и получаю ответ в виде динамического объекта. Я просматриваю результаты и пытаюсь десериализовать их так:
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: Unexpected character encountered while parsing value: [. Path 'FlagCalculateclientside', line 1, position 28. at Newtonsoft.Json.JsonTextReader.ReadAsBoolean() at Newtonsoft.Json.JsonReader.ReadForType(JsonContract contract, Boolean hasConverter) ...
Я предполагаю, что это потому, что значения находятся в массивах, но ожидалось только одно значение для каждого ключа.
Есть идеи, как это исправить?
Откуда берутся результаты? Как устроены эти данные/объект?
@ЯВЛЯЮСЬ. Патель Да, это значение "сериализованный"
@Tony Abrams Я делаю запрос клиенту Gremlin, например: var results = await gremlinClient.SubmitAsync<dynamic>(requestScript).ConfigureAwait(false);
requestScript просто содержит мою строку запроса Gremlin
Как выглядит запрос Gremlin?
Ваша модель не соответствует вашему 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; }
}
Хотя это «исправляет» проблему, не имеет смысла заставлять модель иметь массивы, поскольку OP заявляет, что они ожидают только одно значение для каждого поля в модели.
@TonyAbrams OP спросил, как решить проблему, и это сделало это. Альтернативой является исправление запроса Gremlin, но это довольно сложно сделать. Обычно Gremlin предоставляет вам значения свойств в виде массивов.
Спасибо за ответ. Я надеюсь, что смогу сопоставить первое свойство в каждом массиве со свойством в моей модели. В этих массивах никогда не будет более одного элемента, просто ответ такой...
@kanpeki Ну, это означает, что вам нужно изменить свой запрос, который является совершенно другим вопросом.
@DavidG Я не очень хорошо с этим знаком, но нет ли способа создать собственный десериализатор?
@kanpeki Хорошо, я добавил пример использования пользовательского конвертера.
Код с комментариями в вопросе - это ваш ответ json?