【问题标题】:Custom JsonConverter (System.Text.Json) producing invalid json自定义 JsonConverter (System.Text.Json) 产生无效的 json
【发布时间】:2020-06-04 11:19:33
【问题描述】:

这是我要自定义序列化的类:

public class MyClass
{
    public string Key {get; set;}
    public IEnumerable<string> Value {get; set;}
}

如果我有它的列表,正常的序列化会产生以下输出:

[
    {
        "Key": "MyKey1",
        "Value": [
            "Value1",
            "Value2"
        ]
    },
    {
        "Key": "MyKey2",
        "Value": [
            "Value3",
            "Value4"
        ]
    }
]

我想要的是从 json-result 中删除属性名称,如下所示:

[    
    {
        "MyKey1": [
            "Value1",
            "Value2"
        ]
    },
    {
        "MyKey2": [
            "Value3",
            "Value4"
        ]
    }
]

所以我决定像这样实现一个自定义的 JsonConverter:

public class MyClassJsonConverter : JsonConverter<MyClass>
{
    public override void Write(Utf8JsonWriter writer, MyClass value, JsonSerializerOptions options)
    {
        //custom code goes here
        writer.WriteStartArray(value.Key);

        foreach (var val in value.Value)
            writer.WriteStringValue(val);

        writer.WriteEndArray();
    }
}

但这会产生无效的 json:

[
    "MyKey1": [
        "Value1",
        "Value2"
    ],
   "MyKey2": [
       "Value3",
       "Value4"
    ]
]

如何解决?

【问题讨论】:

  • 你应该写开始和结束元素
  • 为什么不考虑使用Dictionary&lt;string, IEnumerable&lt;string&gt;&gt;数据结构?
  • Dictionary&lt;string, IEnumerable&lt;string&gt;&gt; p = new Dictionary&lt;string, IEnumerable&lt;string&gt;&gt;(); p.Add("MyKey1", new List&lt;string&gt; { "Value1", "Value2" }); p.Add("MyKey2", new List&lt;string&gt; { "Value3", "Value4" }); Console.WriteLine(JsonConvert.SerializeObject(p)); 输出:{"MyKey1":["Value1","Value2"],"MyKey2":["Value3","Value4"]}

标签: c# json .net-core system.text.json jsonconverter


【解决方案1】:

您应该在写入数组之前使用WriteStartObject(),之后使用WriteEndObject()

public override void Write(Utf8JsonWriter writer, MyClass value, JsonSerializerOptions options)
{
    writer.WriteStartObject();

    //custom code goes here
    writer.WriteStartArray(value.Key);

    foreach (var val in value.Value)
        writer.WriteStringValue(val);

    writer.WriteEndArray();
    writer.WriteEndObject();
}

然后是下面的代码

var list = new List<MyClass>
{
    new MyClass { Key = "MyKey1", Value = new[] { "Value1", "Value2" } },
    new MyClass { Key = "MyKey2", Value = new[] { "Value3", "Value4" } }
};

var options = new JsonSerializerOptions();
options.Converters.Add(new MyClassJsonConverter());
var json = JsonSerializer.Serialize(list, options);

为您提供预期的 JSON

[
    {
        "MyKey1": [
            "Value1",
            "Value2"
        ]
    },
    {
        "MyKey2": [
            "Value3",
            "Value4"
        ]
    }
]

【讨论】:

    猜你喜欢
    • 2020-10-05
    • 2022-12-14
    • 1970-01-01
    • 2020-05-01
    • 1970-01-01
    • 2021-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多