2011-05-12 13 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); 
}