2016-02-26 38 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

相關問題