System.Text.Json.JsonSerializer.Serialize 添加 \u0022

MrC*_*udz 18 c#

如何设置 JsonSerializer 不将“\u0022”添加到 EventData 属性的字符串中?因为我得到:

{“Id”:5,“CreateDate”:“2021-04-21T05:26:30.9817284Z”,“EventData”:“{\u0022Id\u0022:1,\u0022电子邮件\u0022:\u0022test@test.test\u0022 }"}

我永远不会反序列化EventData,它必须是可读的。而且我要:

{"Id":5,"CreateDate":"2021-04-21T05:26:30.9817284Z","EventData":"{Id:1,Email:test@test.test}"}
Run Code Online (Sandbox Code Playgroud)

我的代码:

public class EmailSent
{
    public int Id { get; set; }
    public string Email { get; set; }
}

public class UserCreated
{
    public int Id { get; set; }
    public DateTime CreateDate { get; set; }
    public string EventData { get; set; }
}

var emailSent = new EmailSent
{
    Id = 1,
    Email = "test@test.test"
};

var userCreated = new UserCreated
{
    Id = 5,
    CreateDate = DateTime.UtcNow,
    EventData = JsonSerializer.Serialize(emailSent) // I will never deserialize it
};

string result = JsonSerializer.Serialize(userCreated);
Run Code Online (Sandbox Code Playgroud)

tym*_*tam 27

例如,您可以使用UnsafeRelaxedJsonEscaping

var serializeOptions = new JsonSerializerOptions
{
    WriteIndented = true,
    Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping
};

string json = JsonSerializer.Serialize(userCreated, serializeOptions);
Run Code Online (Sandbox Code Playgroud)

这将产生以下输出:

{
  "Id": 5,
  "CreateDate": "2021-04-21T07:49:23.4378969Z",
  "EventData": "{\"Id\":1,\"Email\":\"test@test.test\"}"
}

Run Code Online (Sandbox Code Playgroud)

参考:如何使用 System.Text.Json 自定义字符编码。请阅读那里的警告:

警告

与默认编码器相比,UnsafeRelaxedJsonEscaping 编码器更宽松地允许字符通过未转义的:(...)


小智 8

发生这种情况是因为 JsonSerializer.Serialize() 被多次调用。


小智 0

您可以指定“JSONSerializerOptions”编码器等于JavaScriptEncoder。像这样创建(new TextEncoderSettings(UnicodeRanges.All))

public static string ToString(this object str)
{
    try
    {
         string sResult = JsonSerializer.Serialize(str, new JsonSerializerOptions{WriteIndented = true, Encoder = JavaScriptEncoder.Create(new TextEncoderSettings(System.Text.Unicode.UnicodeRanges.All))});
         return sResult;
    }
}
Run Code Online (Sandbox Code Playgroud)