当输入字符串无效Json并且是或以数字开头时,请使用JsonConvert.DeserializeObject

时间:2014-02-25 13:29:34

标签: c# json deserialization json-deserialization

我想找到一个很好的解决方案,用于处理以数字开头或仅包含数字的普通字符串的反序列化,并理解为什么它不能像现在这样工作。

我无法控制输入字符串,所以我不能依赖它们是有效的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.

当字符串只包含数字或以数字开头时,为什么它不起作用?有没有更聪明的方法来解决这个问题,而不是用“[{}]”包装输入字符串?

1 个答案:

答案 0 :(得分:2)

您的问题源于JSON解析器以及您传递的内容。

2是一个有效值,例如imag JsonConvert.DeserializeObject<int>('2');

但是a2并不是因为它可能将其视为不完整的标识符或属性,它不能存在于对象文字之外。它不是一个字符串,因为没有封闭的引号。

你基本上试图让JSON解析器解析无效的JSON,当然它不会这样做。

在你的情况下,我实际上会做这样的事情:

MyClass cls = null;

if (json.StartsWith("{")) {
    cls = JsonConvert.DeserializeObject<MyClass>(json);
} else {
    cls = new MyClass() {
        Key = json
    };
}

这将检查{}哪些对象应该开始/结束。如果我们找到{,我们可以假设它是一个对象并反序列化,如果不是,我们手动创建一个类的实例并填写该值。

我当然在这里做一些假设。