You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求Manatee Json中类似Newtonsoft JsonConverter自定义读写序列化的示例

嘿,刚好我对Manatee.Json的自定义转换逻辑挺熟悉的——它确实提供了和Newtonsoft.Json里可重写JsonConverter的ReadJson/WriteJson类似的能力,核心是实现IJsonConverter接口。下面给你具体的实现示例和步骤,一看就明白:

1. 核心接口:IJsonConverter

Manatee.Json中自定义序列化/反序列化逻辑的核心是IJsonConverter接口,它包含三个关键方法:

  • Serialize:对应Newtonsoft的WriteJson,负责将.NET对象序列化为JsonValue
  • Deserialize:对应Newtonsoft的ReadJson,负责将JsonValue反序列化为.NET对象
  • ShouldSerialize:告诉序列化器当前转换器适用于哪些类型
2. 完整示例:自定义Person类型转换器

假设我们有一个Person类,想要自定义它的序列化格式(比如把FirstName和LastName合并为full_name,Age改为years),可以这样实现转换器:

using Manatee.Json;
using Manatee.Json.Serialization;
using System;

// 自定义业务类型
public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Age { get; set; }
}

// 实现自定义转换器
public class PersonConverter : IJsonConverter
{
    // 序列化:将Person转为自定义结构的JsonValue
    public JsonValue Serialize(object value, JsonSerializer serializer)
    {
        var person = (Person)value;
        return new JsonObject
        {
            ["full_name"] = $"{person.FirstName} {person.LastName}",
            ["years"] = person.Age
        };
    }

    // 反序列化:将JsonValue还原为Person对象
    public object Deserialize(JsonValue json, Type type, JsonSerializer serializer)
    {
        if (!json.IsObject) throw new JsonSerializationException("Expected JSON object.");
        
        var jsonObj = json.Object;
        var nameParts = jsonObj["full_name"].StringValue.Split(' ', StringSplitOptions.RemoveEmptyEntries);
        
        return new Person
        {
            FirstName = nameParts[0],
            LastName = nameParts[1],
            Age = (int)jsonObj["years"].NumberValue
        };
    }

    // 指定转换器适用的类型
    public bool ShouldSerialize(Type type)
    {
        return type == typeof(Person);
    }
}
3. 注册并使用转换器

要让序列化器识别并使用自定义转换器,需要将其添加到JsonSerializer的转换器集合中:

// 初始化序列化器并注册转换器
var serializer = new JsonSerializer();
serializer.Converters.Add(new PersonConverter());

// 序列化示例
var person = new Person { FirstName = "John", LastName = "Doe", Age = 30 };
JsonValue serializedJson = serializer.Serialize(person);
Console.WriteLine(serializedJson.ToString());
// 输出:{"full_name":"John Doe","years":30}

// 反序列化示例
var deserializedPerson = serializer.Deserialize<Person>(serializedJson);
Console.WriteLine($"Name: {deserializedPerson.FirstName} {deserializedPerson.LastName}, Age: {deserializedPerson.Age}");
// 输出:Name: John Doe, Age: 30
4. 额外实用提示
  • 处理嵌套对象时,不要手动序列化/反序列化子对象,直接使用传入的serializer参数递归处理,比如serializer.Serialize(person.Address)
  • 如果需要支持多个类型,可以扩展ShouldSerialize的判断逻辑,比如return type == typeof(Person) || type == typeof(Employee)
  • 对于nullable类型或值类型,记得先判断JsonValue的类型(比如json.IsNumber、json.IsString),避免空引用或类型转换异常

内容的提问来源于stack exchange,提问作者Piyush Sardana

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:22:16