使用JavaScriptSerializer进行解析的json无效

时间:2016-05-19 06:33:45

标签: c# json

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

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

不了解其行为。

只需要' 10'对于整数。

代码段:

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.}");

3 个答案:

答案 0 :(得分:1)

这里有两件事情可以发挥作用:

该JSON的唯一无效部分是其引号。 enter image description here实际上只允许用双引号引用字符串,所以$scope.severity_lists = function(){ console.log('Stage1: Loading Sods..... '); $http.get('{% url "severities" %}').success( function(data){ $scope.severity_list = data['objects']; }).error(function(data, status){ console.log('Stage1: Internal error while loading initial data:'+status ); }); }; $scope.severity_lists(); 支持反序列化单引号可能有点奇怪。

这是支持多种替代格式的慎重选择。 JSON实际上甚至支持省略属性名称的引号,因此以下内容也是有效的(考虑到它也是一个有效的JavaScript表达式,这是有意义的):

JavaScriptSerializer

您提到的另一部分是{ firstName: 'John', lastName: 'Doe', id: 10. } 数字,它不是整数但是反序列化 整数。这是因为类似JSON的JavaScript只知道数字。整数和非整数之间没有区别;只有一个数字类型是underlying deserializer,就像.NET的双重。

因此,在反序列化时,不能考虑基类型,因为它总是双倍的。但是IEEE-754 floating point number实际上确实试图从实际的字符串表示中获取一些信息。因此值10.将返回一个整数,而值10将返回一个小数。

但是,当使用该信息并且underlying deserializer放宽限制时,以及applied to the target type将小数转换为int - 因为小数10.适合int

答案 1 :(得分:0)

首先,有效的JSON有双引号,因此输入应该如下:

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

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

答案 2 :(得分:0)

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