gpt4 book ai didi

c# - Json.net 如何将对象序列化为值

转载 作者:IT王子 更新时间:2023-10-29 04:49:09 25 4
gpt4 key购买 nike

我仔细阅读了文档、StackOverflow 等,似乎找不到这个...

我想做的是将一个简单的值类型的对象序列化/反序列化为一个值,而不是一个对象,如下所示:

public class IPAddress
{
byte[] bytes;

public override string ToString() {... etc.
}

public class SomeOuterObject
{
string stringValue;
IPAddress ipValue;
}

IPAddress ip = new IPAddress("192.168.1.2");
var obj = new SomeOuterObject() {stringValue = "Some String", ipValue = ip};
string json = JsonConverter.SerializeObject(obj);

我想要的是像这样序列化 json:

// json = {"someString":"Some String","ipValue":"192.168.1.2"} <- value serialized as value, not subobject

不是 ip 成为嵌套对象的地方,例如:

// json = {"someString":"Some String","ipValue":{"value":"192.168.1.2"}}

有人知道怎么做吗?谢谢! (附:我将 Json 序列化连接到一个庞大的遗留 .NET 代码库,所以我不能真正更改任何现有类型,但我可以扩充/分解/修饰它们以促进 Json 序列化。)

最佳答案

您可以使用 IPAddress 类的自定义 JsonConverter 来处理此问题。这是您需要的代码:

public class IPAddressConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return (objectType == typeof(IPAddress));
}

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
return new IPAddress(JToken.Load(reader).ToString());
}

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
JToken.FromObject(value.ToString()).WriteTo(writer);
}
}

然后,将 [JsonConverter] 属性添加到您的 IPAddress 类,您就可以开始了:

[JsonConverter(typeof(IPAddressConverter))]
public class IPAddress
{
byte[] bytes;

public IPAddress(string address)
{
bytes = address.Split('.').Select(s => byte.Parse(s)).ToArray();
}

public override string ToString()
{
return string.Join(".", bytes.Select(b => b.ToString()).ToArray());
}
}

这是一个工作演示:

class Program
{
static void Main(string[] args)
{
IPAddress ip = new IPAddress("192.168.1.2");
var obj = new SomeOuterObject() { stringValue = "Some String", ipValue = ip };
string json = JsonConvert.SerializeObject(obj);
Console.WriteLine(json);
}
}

public class SomeOuterObject
{
public string stringValue { get; set; }
public IPAddress ipValue { get; set; }
}

输出:

{"stringValue":"Some String","ipValue":"192.168.1.2"}

关于c# - Json.net 如何将对象序列化为值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24472404/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com