這不是導致此問題的序列化程序; Json.Net處理外來字符就好了。更有可能您正在執行以下任一操作:
- 將JSON寫入文件或數據流時使用不適當的編碼(或不設置編碼)。您應該使用
Encoding.UTF8
。
- 將JSON存儲到數據庫中的
varchar
列中,而不是nvarchar
。 varchar
不支持unicode字符。
- 使用不支持unicode的查看器查看JSON,使用錯誤的編碼和/或使用沒有完整Unicode字符符號字體的字體。例如,Windows命令提示符窗口似乎有此問題。
爲了證明序列化程序不是問題,請嘗試編譯並運行以下示例程序。它將使用相同的JSON創建兩個不同的輸出文件,一個使用UTF-8編碼,另一個使用默認編碼。使用記事本打開每個文件。 「默認」文件的外部字符爲?
個字符。在UTF-8編碼文件中,您應該看到所有字符都是完整的。 (如果仍然沒有看到它們,請嘗試將記事本字體更改爲「Arial Unicode MS」。)
您還可以在使用Visual Studio調試器的JSON中看到外來字符是正確的;只需在JSON序列化的行之後放置一個斷點並檢查變量json
。
using System;
using System.Collections.Generic;
using System.IO;
using Newtonsoft.Json;
class Program
{
static void Main(string[] args)
{
List<Foo> foos = new List<Foo>
{
new Foo { Language = "Hebrew", Sample = "אספירין" },
new Foo { Language = "Hindi", Sample = "एस्पिरि" },
new Foo { Language = "Chinese", Sample = "阿司匹林" },
new Foo { Language = "Japanese", Sample = "アセチルサリチル酸" },
};
var json = JsonConvert.SerializeObject(foos, Formatting.Indented);
File.WriteAllText("utf8.json", json, Encoding.UTF8);
File.WriteAllText("default.json", json, Encoding.Default);
}
}
class Foo
{
public string Language { get; set; }
public string Sample { get; set; }
}
由於布萊恩 - 有益的意見,我跟蹤的問題了,它是在處理上游,數據是壓縮和存儲在二進制數據庫列,當它被從數據庫中檢索它是使用默認編碼返回,而不是UTF8。現在修復和工作。 'Newtonsoft.Json.JsonConvert.DeserializeObject>(Encoding.Default.GetString(decompressed),new JsonSerializerSettings {TypeNameHandling = TypeNameHandling.All});' –
太棒了!我很高興你能解決這個問題。 –