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



我想序列化(和反序列化)一个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对象。

如何实现我正在寻找的序列化逻辑?

如何做到这一点的答案在System.Text.Json文档中有解释。实现一个自定义转换器,并在序列化过程中使用它。

注意:在您的示例中,不可能从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"
}

您将不需要任何自定义序列化器,如果您添加一些属性到您的类

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() { }
}

我不知道你为什么不这么做?
如果您想要允许对象的值为空,请添加?

public class ItemNumber
{
public string? Number { get; set; }
public ItemNumber(string itemNumber)
{
this.Number = itemNumber;
}
}
public class Item
{
//Can be any data type / object
public int? ItemNumber { get; set; }
public List<int>? ItemNumbers { get; set; }
public ItemNumber? Number { get; set; }
}

,然后……

//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。

相关内容

  • 没有找到相关文章

最新更新