json 如何将对象序列化和反序列化为字符串?

svmlkihl  于 2022-11-19  发布在  其他
关注(0)|答案(3)|浏览(212)

我想将一个C#对象序列化(和反序列化)为一个json字符串。通常,当对象被序列化时,对象被包含在生成的json中的一对{}中。但这里我感兴趣的是对象只被序列化为一个字符串。
我有兴趣这样做来封装关于ItemNumber应该如何格式化的逻辑。但是我没有兴趣公开我正在使用ItemNumber的类而不是普通字符串的事实。
下面是一个我正在寻找的例子。类ItemNumber包含在类Item中。

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);
}

我希望将Item序列化为json,如下所示:

{
    "itemNumber": "ABC-1234" // <- Notice, not an object. Just a string
}

我知道我可能必须实现自定义的序列化程序,但是指南已经发现似乎假设C#对象应该总是被序列化为json对象。
如何实现我正在寻找的序列化逻辑?

waxmsbnn

waxmsbnn1#

the System.Text.Json documentation中解释了如何执行此操作的答案。实现一个自定义转换器并在序列化期间使用它。
注意:在您的示例中,不可能从ItemNumber中提取值,我实现了ToString方法。

public class ItemNumber
{
    private string _value;

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

    public override string ToString()
    {
        return _value;
    }
}

public class Item
{
    // rename output property
    [JsonPropertyName("itemNumber")]
    // use custom converter
    [JsonConverter(typeof(ItemNumberJsonConverter))]
    public ItemNumber ItemNumber { get; set; }
}

public class ItemNumberJsonConverter : JsonConverter<ItemNumber>
{
    public override ItemNumber Read(
        ref Utf8JsonReader reader,
        Type typeToConvert,
        JsonSerializerOptions options) =>
            new ItemNumber(reader.GetString()!);

    public override void Write(
        Utf8JsonWriter writer,
        ItemNumber val,
        JsonSerializerOptions options) => writer.WriteStringValue(val.ToString());
}

internal class Program
{
    static void Main(string[] args)
    {
        var itemNumber = new ItemNumber("ABC-1234");
        var item = new Item
        {
            ItemNumber = itemNumber,
        };

        var serializeOptions = new JsonSerializerOptions
        {
            WriteIndented = true,
        };

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

        Console.WriteLine(json);
    }
}

控制台输出

{
  "itemNumber": "ABC-1234"
}
u0sqgete

u0sqgete2#

如果向类中添加一些属性,则不需要任何自定义序列化程序

public class Item
{
    [System.Text.Json.Serialization.JsonIgnore]
    public ItemNumber ItemNumber { get; set; }

    [System.Text.Json.Serialization.JsonPropertyName("itemNumber")]
    public string _itemNumberValue
    {
        get { return ItemNumber==null? null: ItemNumber.ToString(); }
        set {ItemNumber = new ItemNumber(value);}
    }

    public Item(string itemNumber)
    {
        ItemNumber = new ItemNumber(itemNumber);
    }
    public Item() { }
}
bpzcxfmw

bpzcxfmw3#

我不知道你为什么不这么做?
如果您要允许对象的值可以为Null,请加入?
第一个
然后...

//Where ever you're populating the object
var itemNumbers = new Item
{
    ItemNumber = 1,
    ItemNumbers = new List<int> { 1, 2, 3, 4 },
    Number = new ItemNumber("ABC-1234")
};

//Write this output to a new file or and existing one to update it.
var output = JsonConvert.SerializeObject(itemNumbers);
/* Output
 * {
 *     "ItemNumber": 1,
 *     "ItemNumbers": [1,2,3,4],
 *     "Number": {"Number":"ABC-1234"}
 * }
 */

编辑:强烈建议使用Newtonsoft

相关问题