首页 新闻 搜索 专区 学院

.NET Core 3.0 中使用 System.Text.Json 序列化中文时的编码问题

0
悬赏园豆:200 [已解决问题] 解决于 2019-08-30 21:39

使用下面的代码进行 json 序列化

class Program
{
    static void Main(string[] args)
    {
        var json = JsonSerializer.ToString(new { title = "代码改变世界" } );
        Console.WriteLine(json);
    }
}

输出的中文被编码了

{"title":"\u4ee3\u7801\u6539\u53d8\u4e16\u754c"}

请问如何让中文不被编码?

问题补充:

github 上的相关 issue :Utf8JsonWriter.WriteString do not honor escape=false

dudu的主页 dudu | 高人七级 | 园豆:38815
提问于:2019-05-14 21:45

Hello dudu 我们也遇到了.net core 3.0 api/signalr输出接口的编码不正确问题,这个最终是怎么修改的呢?

蜗牛往前走 1年前

@蜗牛往前走: 目前只能改用 json.net

dudu 1年前
< >
分享
最佳答案
2

var options = new JsonSerializerOptions ();
options.Encoder = System.Text.Encodings.Web.JavaScriptEncoder.Create (UnicodeRanges.All);
var json=JsonSerializer.Serialize (new { title = "代码改变世界" }, options);
Console.WriteLine(json);

收获园豆:180
X_Stars | 菜鸟二级 |园豆:307 | 2019-08-30 15:10

赞!对于 web api 项目,在 Startup 中添加如下的配置

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers().AddJsonOptions(options =>
    {
        options.JsonSerializerOptions.Encoder = JavaScriptEncoder.Create(UnicodeRanges.All);
    });
}
dudu | 园豆:38815 (高人七级) | 2019-08-30 21:38

@dudu: 中文这样可以了, 但是符号(转义字符)还是不对

taadis | 园豆:219 (菜鸟二级) | 2019-09-27 11:29

@taadis: 看到你自己找到了解决方法

string bJsonString = System.Text.Json.JsonSerializer.Serialize(
    value: jsonObject,
    options: new System.Text.Json.JsonSerializerOptions
    { 
        Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping
    });
dudu | 园豆:38815 (高人七级) | 2019-09-28 11:11

@dudu: 是啊 平时都是习惯使用 Newtonsoft.Json, 也习惯了其的一些默认行为, 现在对比一看门道好多...

taadis | 园豆:219 (菜鸟二级) | 2019-09-28 11:14
其他回答(5)
0

https://github.com/dotnet/corefx/blob/master/src/System.Text.Json/docs/SerializerProgrammingModel.md

The JsonIgnore attribute specifies that the property is not serialized or deserialized.

[JsonIgnore] public DateTime? BirthDay { get; set; }

这个属性吗

收获园豆:10
BUTTERAPPLE | 园豆:2950 (老鸟四级) | 2019-05-14 22:15

[JsonIgnore] 是不对指定的属性进行序列化,我想要的效果是

{"title":"代码改变世界"}
支持(0) 反对(0) dudu | 园豆:38815 (高人七级) | 2019-05-14 22:21
0

JsonConvert.SerializeObject

收获园豆:10
二五六七 | 园豆:222 (菜鸟二级) | 2019-05-15 10:14

这是 Json.NET 中才有的

支持(0) 反对(0) dudu | 园豆:38815 (高人七级) | 2019-05-15 10:21
1

.net core 3.0 preview7 JsonSerializerOptions 都没有 Encoder属性。
需要preview8才可以

特朗普书记 | 园豆:26 (初学一级) | 2019-08-30 22:52

原来如此

支持(0) 反对(0) dudu | 园豆:38815 (高人七级) | 2019-08-31 07:44
0

能写进startup.cs做全局设定吗?如果输出到页面
services.AddMvc().AddJsonOptions(options =>
{
options.JsonSerializerOptions.Encoder = JavaScriptEncoder.Create(UnicodeRanges.All);
});
这样写是可以的,但如果是插入数据库,那就不起作用了,直接把中文编码进数据库了,求解。

Dreaming | 园豆:81 (初学一级) | 2020-01-04 16:55
0

我真的疯了,楼主找到解决办法了吗,我就想让这个东西变成正常中文,搜遍C#找不到怎么搞

LauZyHou | 园豆:204 (菜鸟二级) | 2020-04-01 00:21

解决方法在最佳答案中。

支持(0) 反对(0) dudu | 园豆:38815 (高人七级) | 2020-04-01 07:45

@dudu: 您好,webapi在System.Text.Json.JsonSerializer.Serialize(obj,options)中设置Encoder = JavaScriptEncoder.Create(UnicodeRanges.All);是可以的,但是Startup中全局配置没有生效
services.AddControllers().AddJsonOptions(options =>
{
options.JsonSerializerOptions.Encoder = JavaScriptEncoder.Create(UnicodeRanges.All);
});
请教下是什么问题呢?

支持(0) 反对(0) 最美的不是下雨天 | 园豆:58 (初学一级) | 2020-09-21 19:48

@最美的不是下雨天: 我们在项目中这样设置是有效的

支持(0) 反对(0) dudu | 园豆:38815 (高人七级) | 2020-09-21 20:48

@dudu: 好吧,谢谢您,今天来把电脑重启下竟然可以了,也是稀奇

支持(0) 反对(0) 最美的不是下雨天 | 园豆:58 (初学一级) | 2020-09-22 09:27
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册