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

如何在C#中将自定义对象序列化为JSON字符串而非JSON对象?

问题:将自定义C#对象序列化为JSON字符串而非对象

我需要把C#对象直接序列化为JSON字符串(而非默认的JSON对象),同时也要支持反序列化。这么做是为了封装ItemNumber的格式化逻辑,对外隐藏我用类而非普通字符串实现ItemNumber的细节。

示例代码如下:

public class ItemNumber
{
    private string _value;

    public ItemNumber(string num)
    {
        _value = num;
    }
}

public class Item
{
    public ItemNumber ItemNumber { get; set; }
}

public void Main()
{
    var itemNumber = new ItemNumber("ABC-1234");
    var item = new Item
    {
        ItemNumber = itemNumber,
    };

    var json = System.Text.Json.JsonSerializer.Serialize(item);
}

期望序列化后的JSON格式:

{
    "itemNumber": "ABC-1234" // 注意:不是对象,只是字符串
}

我知道需要自定义序列化,但找到的指南都默认C#对象会序列化为JSON对象,请问该如何实现?


解决方案:自定义JSON转换器

针对你使用的System.Text.Json序列化库,只需为ItemNumber实现一个自定义转换器,就能让它直接序列化为字符串,同时支持反向解析。

1. 实现JsonConverter<ItemNumber>

这个转换器负责处理ItemNumber的序列化/反序列化逻辑:

using System.Text.Json;
using System.Text.Json.Serialization;

public class ItemNumberConverter : JsonConverter<ItemNumber>
{
    // 序列化:将ItemNumber转为JSON字符串
    public override void Write(Utf8JsonWriter writer, ItemNumber value, JsonSerializerOptions options)
    {
        // 读取ItemNumber内部的字符串值并写入JSON
        writer.WriteStringValue(value.Value);
    }

    // 反序列化:将JSON字符串转为ItemNumber实例
    public override ItemNumber Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        string num = reader.GetString();
        return new ItemNumber(num);
    }
}

2. 调整ItemNumber类的成员可见性

由于私有成员_value无法被转换器直接访问,需给ItemNumber添加一个供转换器读取的内部属性:

public class ItemNumber
{
    private string _value;

    public ItemNumber(string num)
    {
        _value = num;
    }

    // 新增内部属性,供转换器读取字符串值
    internal string Value => _value;
}

3. 注册转换器(二选一)

方式一:用特性标记类

直接在ItemNumber类上添加特性,让序列化器自动识别并使用转换器:

[JsonConverter(typeof(ItemNumberConverter))]
public class ItemNumber
{
    // ... 原有代码 ...
}

方式二:在序列化选项中手动添加

如果不想修改ItemNumber类的特性,可在序列化时传入配置好的选项:

public void Main()
{
    var itemNumber = new ItemNumber("ABC-1234");
    var item = new Item { ItemNumber = itemNumber };

    var options = new JsonSerializerOptions
    {
        // 可选:配置驼峰命名,让JSON键为"itemNumber"而非"ItemNumber"
        PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
        Converters.Add(new ItemNumberConverter())
    };

    var json = System.Text.Json.JsonSerializer.Serialize(item, options);
    // 输出结果:{"itemNumber":"ABC-1234"}
}

内容的提问来源于stack exchange,提问作者SørenHN

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 17:10:23