2016-02-26 39 views
1

我遇到奇怪的问题.Bellow你可以看到我的测试代码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\" : Isometext }")); 
    var s = new DataContractJsonSerializer(typeof(Test)); 
    var r = (Test)s.ReadObject(ms); 
    Console.WriteLine(r.Name); 
} 

名= Isometext - OK

名= Tsometext -Exception

名= Nsometext - 确定

name = sometext - 异常

名= nsometext - 异常

为什么DataContractJsonSerializer对待与资本ñ为正确的值开始值?它是错误吗?

+1

看起来像一个无效的json字符串。你是否尝试用''{{“Name \”:\“sometext \”}“'''双引号来包装** sometext **字符串' – bkdev

+1

是否必须使用DataContractJsonSerializer?我知道这个问题与你所问的问题无关。但是我仍然很好奇你为什么使用DataContractJsonSerializer,当Newtonsoft.Json可以为你提供更好的性能。 –

+0

只能使用'UTF8'。 –

回答

-1

不知道为什么它对大写字母和非大写字母的行为不同,但要解决它,您需要将字符串值包含在“”中,如\“isometext \”。

+0

这不是逃避。只是将此值转换为字符串字面值 – cosset

+0

您不能只是构建你自己的json规范的解释,并期望它能够工作。 json中的字符串需要用引号括起来。 来自json规范“一个字符串是一个由零个或多个Unicode字符组成的序列,用双引号括起来,使用反斜杠转义字符表示为单个字符字符串,字符串非常类似于C或Java字符串。 “ –

+0

是的,我们没有用引号括起来,它应该抛出异常,但对于某些值(请参阅我的问题中的示例),异常不会抛出。这是一个问题 – cosset

1

哇,挖掘它进一步导致我here

由于您没有包裹Isometext加上双引号,DataContractJsonSerializer被处理,作为数字格式,它似乎认为

N为NaN

我的无限

而且,NewtonSoft.JSON似乎处理它比DataContractJsonSerializer更好。请参阅http://www.newtonsoft.com/json/help/html/JsonNetVsDotNetSerializers.htm

+0

你是对的,但这是不正确的JSON格式,如果我们通过Nsometext? – cosset

+0

是的,这是不正确的。 DataContractJsonSerializer似乎将Nsometext视为NaN – bkdev

相关问题