【问题标题】:How to custom serialise json with .net core and JsonSerializer如何使用 .net 核心和 JsonSerializer 自定义序列化 json
【发布时间】:2021-03-21 23:27:58
【问题描述】:

我的实现返回一个字符串,其中 json 属性名字符串被转义。这与 json 格式不匹配,会带来一些问题。有没有办法使用 JsonSerializer,或者我必须像 Microsoft 文档中建议的那样手动构建属性的输出属性。

所以我的序列化似乎可以工作,但将其放入正确的 json 格式似乎失败了。

        public override void Write(Utf8JsonWriter writer, IMyInterface value, JsonSerializerOptions options)
        {
            switch (value)
            {
                case Implementation1 i1:
                    writer.WriteStringValue(JsonSerializer.Serialize(i1, options));
                    return;
                case Implementation2 i2:
                    writer.WriteStringValue(JsonSerializer.Serialize(i2, options));
                    return;
                case Implementation3 i3:
                    writer.WriteStringValue(JsonSerializer.Serialize(i3, options));
                    break;
            }
        }

这是结果的一部分,例如:["{\"propertyName\":null,...

更新:

我像建议的那样更新了 JsonSerializer 选项,因此它不会在我的 Startup.cs 中的 ConfigureServices 中像这样编码,这似乎无法解决问题。

            services.AddMvc().AddJsonOptions(opts =>
            {
                opts.JsonSerializerOptions.Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping;
            });

【问题讨论】:

  • 你为什么要构建转义的 JSON?
  • @mason 这就是问题所在,我不想将它转义,我想要它的属性 json 格式。
  • @RoarS.It 似乎匹配,但我没有更改输出。我将更新如何将它集成到我的代码中。

标签: c# .net asp.net-core .net-core


【解决方案1】:

正如@GeorgeSquair 已经解释的那样,JsonSerializer.Serialize() 将我的对象转换为 json 字符串并将值传递给writer.WriteStringValue() 将重复此操作,从而导致属性名称转义。我检查了JsonSerializer.Serialize()的参数,发现我可以将writer作为参数传入,很好地解决了这个问题。

public override void Write(Utf8JsonWriter writer, IMyInterface value, JsonSerializerOptions options)
        {
            switch (value)
            {
                case Implementation1 i1:
                    JsonSerializer.Serialize(writer, i1, options);
                    return;
                case Implementation2 i2:
                    JsonSerializer.Serialize(writer, i2, options);
                    return;
                case Implementation3 i3:
                    JsonSerializer.Serialize(writer, i3, options);
                    break;
            }
        }

【讨论】:

    【解决方案2】:

    当你调用JsonSerializer.Serialize()你的对象被转换成一个字符串,代表json。

    接下来将此调用的结果传递给writer.WriteStringValue() 将写入一个字符串值作为 json,这反过来将转义字符串中您已经序列化为 json 的字符。

    尝试改用JsonSerializerOptions

    JsonSerializer.Serialize(i1, new JsonSerializerOptions() { WriteIndented = true });

    【讨论】:

    • 有道理!您的解决方案带来了这个结果:["{\r\n \"propertyName\": null... 这是一个变化,但不幸的是也不正确。
    【解决方案3】:

    也许您应该阅读文档。

    WriteStringValue(String):将字符串文本值(作为 JSON 字符串)写入 JSON 数组的元素。

    您可能想要WriteString(String, String):将属性名称指定为字符串和字符串文本值(作为 JSON 字符串)作为 JSON 对象的名称/值对的一部分。

    【讨论】:

    • 嗯,这将导致我手动迭代我的整个对象并为属性编写 json 属性,就像我在问题中已经提到的那样......我发布了一个方便的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2017-09-24
    • 2011-08-28
    • 2012-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多