2015-09-04 68 views
4

我想將一個.NET對象序列化爲包含諸如中文或俄文的外語字符串的JSON。當我在結果JSON中這樣做(使用下面的代碼)時,它會將那些以字符串形式存儲的字符編碼爲「?」而不是必需的unicode字符。使用JSON.Net序列化外語

using Newtonsoft.Json; 

var serialized = JsonConvert.SerializeObject(myObj, new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All, Formatting = Newtonsoft.Json.Formatting.Indented }); 

有沒有辦法使用JSON.Net序列化程序與外語?

E.g

אספירין(希伯來文)

एस्पिरि(印地文)

阿司匹林(中國)

アセチルサリチル酸(日本)

非常感謝!

回答

6

這不是導致此問題的序列化程序; Json.Net處理外來字符就好了。更有可能您正在執行以下任一操作:

  1. 將JSON寫入文件或數據流時使用不適當的編碼(或不設置編碼)。您應該使用Encoding.UTF8
  2. 將JSON存儲到數據庫中的varchar列中,而不是nvarcharvarchar不支持unicode字符。
  3. 使用不支持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; } 
} 
+0

由於布萊恩 - 有益的意見,我跟蹤的問題了,它是在處理上游,數據是壓縮和存儲在二進制數據庫列,當它被從數據庫中檢索它是使用默認編碼返回,而不是UTF8。現在修復和工作。 'Newtonsoft.Json.JsonConvert.DeserializeObject >(Encoding.Default.GetString(decompressed),new JsonSerializerSettings {TypeNameHandling = TypeNameHandling.All});' –

+0

太棒了!我很高興你能解決這個問題。 –