【问题标题】:Invalid json getting parse using JavaScriptSerializer使用 JavaScriptSerializer 获取解析的 json 无效
【发布时间】:2016-05-19 06:33:44
【问题描述】:

我正在使用 JavaScriptSerializer 类将 json 字符串转换为对象

如果我追加(10.),对于 int 值,'.'、'@' 等符号仍然得到正确的 json,实际上它不是有效的 json 文件。 我已经使用不同的方式检查了这个 json 字符串,但它并不是一直有效。

不明白它的行为。

整数只需要 '10'。

代码sn-p:

class Emp 
{        
    public string firstName
    {
        get;set;
    }
    public string LastName
    {
        set;get;
    }
    public int Id
    {
        set;get;
    }
}

var serializer = new JavaScriptSerializer();
Type t = typeof(Emp);
var returnType = serializer.Deserialize<Emp>("{'firstName': 'John','lastName':'Doe','id': 10.}");

【问题讨论】:

  • 我不明白你在问什么。你能澄清一下吗?
  • "{'firstName': 'John','lastName':'Doe','id': 10.}" 这不是有效的 json ojbect,但仍在解析。
  • 唯一无效的部分是单引号。我假设JavaScriptSerializer 会在知情的情况下接受这一点,并在可能的情况下仍对其进行解析。
  • 是的,我可以理解,但这仍然不是 int(10.) 的有效输入。但是 JavaScriptSerializer 应该会抛出错误。
  • JSON 和 JavaScript 一样,不区分整数和其他非整数数字。它只知道数字,对他们来说10.10 相同。所以反序列化器只看到“数字”(实际上它总是像一个双精度数),并检查它是否可以将它写入目标int 属性。如果这有效(因为双精度恰好是一个整数),那很好。

标签: c# json


【解决方案1】:

这里有两件事起作用:

该 JSON 中唯一真正无效 部分是它的引号。 JSON 实际上只允许用双引号括起来的字符串,所以JavaScriptSerializer 支持反序列化单引号可能有点奇怪。

这是为了支持多种替代格式而经过深思熟虑的选择。 underlying deserializer 实际上甚至支持省略属性名称的引号,因此以下内容也是有效的(考虑到它也是一个有效的 JavaScript 表达式,这很有意义):

{ firstName: 'John', lastName: 'Doe', id: 10. }

您提到的另一部分是10. 数字,它不是整数,但可以很好地反序列化作为整数。这是因为 JSON——像 JavaScript——只知道数字。整数和非整数没有区别;只有一个数字类型是 IEEE-754 floating point number,就像 .NET 的 double。

所以在反序列化时,不能考虑基类型,因为它总是双精度数。但underlying deserializer 实际上确实试图从实际的字符串表示中获取一些信息。所以10 的值将返回一个整数,而10. 的值将返回一个小数。

但是,当随后使用该信息并且 applied to the target type 放宽该限制时,以及将小数转换为 int 的 converter is used - 因为小数 10.0 将适合 int。

【讨论】:

    【解决方案2】:

    首先,一个有效的 JSON 有双引号,所以输入应该如下:

    var returnType2 = serializer.Deserialize<Emp>(@"{""firstName"": ""John"",""lastName"":""Doe"",""id"": 10}");
    

    关于验证部分,请查看MSDN JavaScriptSerializer Class 文档。您可以看到所有原始数字(或数字兼容)类型,如 Byte、Ints、uInts 等,都等效于 JSON Number。虽然 Number(根据 JSON 模式)是 Javascript 中的双精度浮点格式,因此 "id":10. 完全有效,JavaScriptSerializer 必须能够处理。

    【讨论】:

      【解决方案3】:

      Json 对象格式不正确。字符串格式的外部单引号和对象内部的双引号。阅读http://www.w3schools.com/json/ 你可以在这里验证 https://jsonformatter.curiousconcept.com

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多