2011-05-12 42 views
1

我嘗試使用DataContractJsonSerializer將JSON字符串反序列化爲對象。所有工作正常,直到JSON字符串包含一些法文字符,如é è à。它會拋出異常:包含「éèà」字符時反序列化Json以反對的錯誤

反序列化類型爲**的對象時出錯。令牌「',但卻發現‘E’。

有沒有人知道如何解決?

{ "features": [ { "id": "0c50cdc5-da97-45be-aad2-ad1433d8e285LastEditedFeature", "wkt": "", "fieldValues": [ { "Key": "formeID", "Value": "1" }, { "Key": "calqueID", "Value": "1" }, { "Key": "featureID", "Value": "0c50cdc5-da97-45be-aad2-ad1433d8e285" }, { "Key": "Name", "Value": "ABCDé" } ] } ] } 

恐怕,也許它是由在E引起的‘ABCDE’的字符串。

+3

您可能會缺少字符串附近的引號。 [JSONLint](http://www.jsonlint.com/)對此有何評論? – Groo 2011-05-12 16:59:16

+1

或者可能是一個字符集問題。檢查你的序列化的東西是否是UTF-8,並且你是否將它反序列化爲UTF-8。 – CodesInChaos 2011-05-12 18:21:43

回答

1

該錯誤會似乎表明,你在你的字符串的末尾缺少一個報價?

爲了更好地幫助我們,你可以張貼工作和不工作的JSON?

+0

JSON字符串: {「features」:[{「id」:「0c50cdc5-da97-45be-aad2-ad1433d8e285LastEditedFeature」,「wkt」:「」,「fieldValues」:[{「Key」:「formeID」, 「Value」:「1」},{「Key」:「calqueID」,「Value」:「1」},{「Key」:「featureID」,「Value」:「0c50cdc5-da97-45be-aad2-ad1433d8e285 「},{」Key「:」Name「,」Value「:」ABCDé「}]}]} 代碼: DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(type); MemoryStream jsonStream = new MemoryStream(Encoding.Default.GetBytes(jsonString)); resultObject = jsonSerializer.ReadObject(jsonStream); jsonStream.Close(); 它工作,如果編碼是UTF8。 – CuiPengFei 2011-05-12 18:07:09

+3

「它工作,如果編碼是UTF8」一個理智的人使用什麼其他編碼? – CodesInChaos 2011-05-12 18:23:54

+0

@CodesInChaos - [我可以看到](http://stackoverflow.com/a/35676723/2392157)這個問題在[tag:.net-3.5]中即使使用UTF-8。到目前爲止,我找不到任何方法。 – miroxlav 2016-02-27 23:46:06

0

除了接受的答案,似乎在 JSON實現中存在問題。 Plain UTF-8中的JSON序列化和反序列化導致下面顯示的證明字符串上的此錯誤。但是,如果將項目切換爲或更高版本,則問題會立即消失。

string proofString = ""; 
for (int i = 1; i <= 0xffff; i++) { 
    if (i >= 0xd800 && i < 0xe000) continue; // skip code points not belonging to UTF-8 
    proofString += Strings.ChrW(i); 
}