C# DataContractJsonSerializer不正确地处理某些值

C# DataContractJsonSerializer不正确地处理某些值,c#,json,wcf,datacontractjsonserializer,C#,Json,Wcf,Datacontractjsonserializer,我面临着一个奇怪的问题。下面你可以看到我的测试代码 [DataContract] public class Test { [DataMember] public string Name { get; set; } } private static void Main(string[] args) { MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes("{ \"Name\" :

我面临着一个奇怪的问题。下面你可以看到我的测试代码

[DataContract]
public class Test
{
    [DataMember]
    public string Name { get; set; }
}
private static void Main(string[] args)
{
    MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes("{ \"Name\" :   Isometext  }"));
    var s = new DataContractJsonSerializer(typeof(Test));
    var r = (Test)s.ReadObject(ms);
    Console.WriteLine(r.Name);
}
名称=文本-确定

name=Tsometext-异常

name=Nsometext-正常

name=sometext-异常

name=nsometext-异常


为什么DataContractJsonSerializer将以大写字母IN开头的值视为正确的值?这是错误吗?

不知道为什么大写字母和非大写字母的行为不同,但要修复它,您需要将字符串值封装在“”中,例如“isometext\”

不知道大写字母和非大写字母的行为不同,但要修复它,您需要将字符串值封装在“”中,例如“isometext\”

哇,我把它挖得更深了

由于您没有用双引号包装<强> ISOMeTeX,DATACONTractJSONSerialZER将其视为一种数字格式,在这里似乎考虑了

N代表NaN

我渴望无限


而且,NewtonSoft.JSON似乎比DataContractJsonSerializer处理得更好。看

哇,把它挖得更深让我觉得

由于您没有用双引号包装<强> ISOMeTeX,DATACONTractJSONSerialZER将其视为一种数字格式,在这里似乎考虑了

N代表NaN

我渴望无限



而且,NewtonSoft.JSON似乎比DataContractJsonSerializer处理得更好。请参见

似乎是无效的json字符串。您是否尝试将sometext字符串用双引号括起来,如
“{\”Name\:\“sometext\”}”
是否必须使用DataContractJsonSerializer?我知道这个问题与你提出的问题无关。但我仍然很好奇,当Newtonsoft.Json可以为您提供更好的性能时,您为什么要使用DataContractJsonSerializer。它只适用于
UTF8
@Krishna Kumar N,这个序列化程序在wcf中使用,并将其更改为Newtonsoft。Json不是很简单。但是,是的,我需要将其外观更改为无效的Json字符串。您是否尝试将sometext字符串用双引号括起来,如
“{\”Name\:\“sometext\”}”
是否必须使用DataContractJsonSerializer?我知道这个问题与你提出的问题无关。但我仍然很好奇,当Newtonsoft.Json可以为您提供更好的性能时,您为什么要使用DataContractJsonSerializer。它只适用于
UTF8
@Krishna Kumar N,这个序列化程序在wcf中使用,并将其更改为Newtonsoft.Json并不简单。但是,是的,我需要更改它这不是escape。您只是将此值转换为string literal。您不能只是编写自己对json规范的解释并期望它能够工作。json中的字符串需要用引号括起来。根据json规范,“字符串是由零个或多个Unicode字符组成的序列,使用反斜杠转义,用双引号括起来。字符表示为单个字符串。字符串非常类似于C或Java字符串。”是的,我们没有将其括在引号中,它应该引发异常,但对于某些值(请参阅我问题中的示例),不会引发异常。这是一个问题。我假设它试图将大写值作为字符串处理,以允许数据传入,但在内部使用某种形式的大小写解析,然后尝试将其视为属性名,因此引发错误。我很好奇为什么使用“I”和“N”会起作用,但是,既然@SimonHardy建议“Name”是一个字符串,为什么不简单地使用引号来解决这个问题呢?如果名称有中间名,则需要用引号括起来,否则json将因空格而出错。DataContractJsonSerializer的行为很奇怪,但您的字符串仍然缺少引号。这不是escape。您只是将此值转换为string Literal。您不能只是自行解释json规范,并期望它能够正常工作。json中的字符串需要用引号括起来。根据json规范,“字符串是由零个或多个Unicode字符组成的序列,使用反斜杠转义,用双引号括起来。字符表示为单个字符串。字符串非常类似于C或Java字符串。”是的,我们没有将其括在引号中,它应该引发异常,但对于某些值(请参阅我问题中的示例),不会引发异常。这是一个问题。我假设它试图将大写值作为字符串处理,以允许数据传入,但在内部使用某种形式的大小写解析,然后尝试将其视为属性名,因此引发错误。我很好奇为什么使用“I”和“N”会起作用,但是,既然@SimonHardy建议“Name”是一个字符串,为什么不简单地使用引号来解决这个问题呢?如果名称有中间名,则需要用引号括起来,否则json将因空格而出错。DataContractJsonSerializer的行为很奇怪,但是您的字符串缺少引号。您是对的,但是如果我们传递Nsometext,这是不正确的json格式?是的,这是不正确的。DataContractJsonSerializer似乎在考虑Nsometext,因为你是对的,但如果我们传递Nsometext,这是不正确的json格式?是的,这是不正确的。DataContractJsonSerializer似乎将Nsometext视为NaN