使用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 是有效值,例如imagine 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