【问题标题】:Use JsonConvert.DeserializeObject when input string isn't valid Json and is or starts with a number当输入字符串不是有效的 Json 并且是以数字开头或以数字开头时使用 JsonConvert.DeserializeObject
【发布时间】:2014-03-27 18:18:45
【问题描述】:

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

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

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

【问题讨论】:

  • 如果输入是“2”或“2a”,你会期待什么?你想要什么结果?
  • Kevin,我已经更新了这个问题——我希望得到与传入“a”或“a2”时相同的结果,即抛出 Newtonsoft.Json.JsonException(“在解析值:a. Path '', line 0, position 0.").
  • 您正在尝试将输入反序列化为“MyClass[]”强类型。但是您输入的 json 并不代表这种类型。您输入的 json 代表一个 int,其中一个是有效的(“2”),另一个不是“2a”。第二个应该写成 json 中的字符串,即 C# 代码中的 "\"2a\""。所以你的 json 格式不正确,我们需要知道它到底是如何畸形来提出解决方案的。

标签: c# json deserialization json-deserialization


【解决方案1】:

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

2 是一个有效值,例如想象JsonConvert.DeserializeObject&lt;int&gt;('2');

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

您基本上是在尝试让 JSON 解析器解析无效的 JSON,它当然不会这样做。

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

MyClass cls = null;

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

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

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

【讨论】:

  • 为什么解析器将“2”视为 2 而将“2a”视为 2a?我不太明白为什么它对字符串的处理方式不同。
  • 他们不是。解析器可以解析 2,因为它是完全有效的 JavaScript(数字文字)。 2a 不是独立的。例如看这个我用 Firebug 制作的小视频 - screencast.com/t/2UqQwvDiyW9p
猜你喜欢
  • 1970-01-01
  • 2023-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-27
  • 2016-12-08
  • 2014-01-15
  • 2018-01-31
  • 1970-01-01
相关资源
最近更新 更多