Используйте JsonConvert.Десериализуйте объект, если входная строка не является допустимой Json и является или начинается с числа
-
21-12-2019 - |
Вопрос
Я хочу найти хорошее решение для обработки десериализации простых строк, которые начинаются с числа или содержат только число, и понять, почему это не работает так, как сейчас.
Я не могу управлять входными строками, поэтому я не могу полагаться на то, что они являются допустимыми Json, и на данный момент я просто проверяю, является ли это Json, и если это не так, я оберну это в "[{}]", но я хотел посмотреть, есть ли лучший способ.
Вот как я его десериализую:
JsonConvert.DeserializeObject<MyClass[]>(myString);
Мой класс обладает двумя свойствами:
[JsonProperty(PropertyName = "key")]
public string Key { get; set; }
[JsonProperty(PropertyName = "value")]
public string Value { get; set; }
Если входная строка просто "a" или "a2", она выдает Newtonsoft.Json.Исключение JSONException ("Неожиданный символ, обнаруженный при анализе значения:a.Путь ", строка 0, позиция 0."), что и ожидалось, однако "2" и "2a" выдают другие ошибки.Я бы хотел, чтобы для "2" и "2a" было такое же поведение, как для "a" и "a2".
Исключение при передаче в "2":
Newtonsoft.Json.JsonSerializationException : Error converting value 2 to type 'MyClass[]'. Path '', line 1, position 1.
System.ArgumentException : Could not cast or convert from System.Int64 to MyClass[].
Исключение при передаче в "2a":
System.FormatException : Input string was not in a correct format.
Почему это не работает, когда строка содержит только цифры или начинается с цифры?Есть ли более разумный способ исправить это, чем обернуть входную строку с помощью "[{}]"?
Решение
Ваша проблема связана с синтаксическим анализатором JSON и с тем, что вы ему передаете.
2
является допустимым значением, например, представьте JsonConvert.DeserializeObject<int>('2');
Но a2
это не так, поскольку он, вероятно, рассматривает это как неполный идентификатор или свойство, которое не может существовать вне объектного литерала.Это не строка, так как в ней нет заключительных кавычек.
По сути, вы пытаетесь заставить синтаксический анализатор JSON проанализировать недопустимый JSON, чего он, конечно, не сделает.
В вашем случае я бы на самом деле сделал что-то вроде этого:
MyClass cls = null;
if (json.StartsWith("{")) {
cls = JsonConvert.DeserializeObject<MyClass>(json);
} else {
cls = new MyClass() {
Key = json
};
}
Это проверяет наличие {}
с каких объектов следует начинать/заканчивать.Если мы найдем {
мы можем предположить, что это объект, и десериализовать, если нет, мы вручную создадим экземпляр вашего класса и заполним значение.
Я, конечно, делаю здесь некоторые предположения.