gpt4 book ai didi

c# - 将对象序列化为数组

转载 作者:行者123 更新时间:2023-11-30 20:52:27 25 4
gpt4 key购买 nike

我有一个 C# 对象。我想将它序列化为数组而不是键值映射。

我的 C# 类:

[JsonArray()]
public class Foo
{
[JsonProperty(Order = 1)]
public Boolean Bar = true;

[JsonProperty(Order = 2)]
public Boolean Baz = false;
}

所需的 JSON 输出:

[true,false]

实际的 JSON 输出(如果我删除顶部的 JsonArray 属性):

{"Bar":true,"Baz":false}

我在复杂的对象层次结构中有大量对象,我需要将其序列化为数组而不是键值映射。我更喜欢一种不需要进行序列化的东西知道它正在序列化什么的解决方案。我希望能够仅在顶级对象上调用 JsonConvert.SerializeObject(myThing) 并使所有子对象由于它们自身具有的属性而正确序列化。

目前,我的所有对象都实现了 IEnumerable,然后我手动教每个对象如何以正确的顺序返回属性,但这在使用 C# 时会造成混淆,因为智能感知试图为我提供所有的 LINQ 操作在对象上,即使它们都不合适。

我相信有可能向 Foo 添加一个属性,该属性指向另一个知道如何序列化 Foo 的类。像 [JsonConverter(FooSerializer)] 然后 FooSerializer 会实现 JsonConverter。但是,我正在努力寻找有关如何使用 JsonConverter 进行序列化的大量信息,人们提出的大多数问题似乎都与反序列化有关。

最佳答案

下面是如何编写这样的转换器。

[JsonConverter(typeof(FooConverter))]
public class Foo
{
public bool Bar { get; set; }
public bool Baz { get; set; }
}
public class FooConverter : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var foo = value as Foo;
var obj = new object[] { foo.Bar, foo.Baz };
serializer.Serialize(writer, obj);
}

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var arr = ReadArrayObject(reader, serializer);
return new Foo
{
Bar = (bool)arr[0],
Baz = (bool)arr[1],
};
}

private JArray ReadArrayObject(JsonReader reader, JsonSerializer serializer)
{
var arr = serializer.Deserialize<JToken>(reader) as JArray;
if (arr == null || arr.Count != 2)
throw new JsonSerializationException("Expected array of length 2");
return arr;
}

public override bool CanConvert(Type objectType)
{
return objectType == typeof(Foo);
}
}

当谈到序列化/反序列化时,我发现与序列化程序可以根据需要识别和解释的对象的通用表示形式相互转换更容易。

序列化(编写)很简单,因为您想将 Foo 对象的表示更改为值数组,将其转换为值数组并对其进行序列化。

一般来说,反序列化(读取)可能会更困难一些。但同样,方法是相同的。您期待一个 bool 值数组。反序列化为一个数组并对其进行操作以创建您的对象。如果您愿意,您可以在这里执行一些验证,正如我所展示的那样。

有了这个,您应该能够非常轻松地与 JSON 字符串相互转换。

var str = "[[true,true],[true,false]]";
var foos = JsonConvert.DeserializeObject<Foo[]>(str);
var serialized = JsonConvert.SerializeObject(foos);

关于c# - 将对象序列化为数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20875642/

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