Используйте JsonConvert.Десериализуйте объект, если входная строка не является допустимой Json и является или начинается с числа

StackOverflow https://stackoverflow.com//questions/22015670

Вопрос

Я хочу найти хорошее решение для обработки десериализации простых строк, которые начинаются с числа или содержат только число, и понять, почему это не работает так, как сейчас.

Я не могу управлять входными строками, поэтому я не могу полагаться на то, что они являются допустимыми 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
    };
}

Это проверяет наличие {} с каких объектов следует начинать/заканчивать.Если мы найдем { мы можем предположить, что это объект, и десериализовать, если нет, мы вручную создадим экземпляр вашего класса и заполним значение.

Я, конечно, делаю здесь некоторые предположения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top