使用JSON.Net序列化外语

时间:2015-09-04 20:59:28

标签: json.net

我想将.NET对象序列化为JSON,其中包含外语字符串,如中文或俄文。当我在生成的JSON中执行此操作(使用下面的代码)时,它会将那些以字符串形式存储的字符编码为“?”而不是必需的unicode char。

using Newtonsoft.Json;

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

有没有办法将JSON.Net序列化程序与外语一起使用?

E.g

אספירין(希伯来语)

एस्पिरि(hindi)

阿司匹林(中文)

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

非常感谢!

1 个答案:

答案 0 :(得分:9)

导致此问题的不是序列化程序; Json.Net处理外国字符就好了。您更有可能正在执行以下操作之一:

  1. 将JSON写入文件或流时使用不适当的编码(或不设置编码)。您应该使用Encoding.UTF8
  2. 将JSON存储到数据库中的varchar列而不是nvarcharvarchar不支持unicode字符。
  3. 使用不支持unicode的查看器查看JSON,使用错误的编码和/或使用不具有完整的unicode字符字形集的字体。例如,Windows命令提示符窗口似乎存在此问题。
  4. 要证明序列化程序不是问题,请尝试编译并运行以下示例程序。它将使用相同的JSON创建两个不同的输出文件,一个使用UTF-8编码,另一个使用默认编码。使用记事本打开每个文件。 "默认"文件的外来字符为?个字符。在UTF-8编码文件中,您应该看到所有字符都完好无损。 (如果您仍然没有看到它们,请尝试将记事本字体更改为" Arial Unicode MS&#34 ;.)

    您还可以使用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; }
    }