首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将对象序列化为数组

将对象序列化为数组
EN

Stack Overflow用户
提问于 2014-01-02 02:56:05
回答 2查看 2.9K关注 0票数 2

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

我的C#课程:

代码语言:javascript
运行
复制
[JsonArray()]
public class Foo
{
    [JsonProperty(Order = 1)]
    public Boolean Bar = true;

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

所需的JSON输出:

代码语言:javascript
运行
复制
[true,false]

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

代码语言:javascript
运行
复制
{"Bar":true,"Baz":false}

在复杂的对象层次结构中,我有大量的对象,需要将其序列化为数组,而不是键值映射。我更喜欢这样的解决方案,即不要求执行序列化的人员了解它正在序列化的内容。我希望能够在顶级对象上调用JsonConvert.SerializeObject(myThing),并且由于它们本身具有属性,所以能够正确地序列化所有子对象。

目前,我的所有对象都实现了IEnumerable,然后我手动地教每个对象如何按照正确的顺序返回属性,但这在使用C#时会造成混乱,因为intellisense试图为对象提供所有LINQ操作,尽管它们都不合适。

我相信,虽然我不知道如何向Foo添加一个属性,但它指向另一个知道如何序列化Foo的类是可能的。类似于[JsonConverter(FooSerializer)],然后FooSerializer将实现JsonConverter。但是,我很难找到很多关于如何使用JsonConverter进行序列化的信息,人们提出的大多数问题似乎都与反序列化有关。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-02 04:13:48

以下是如何编写这样一个转换器。

代码语言:javascript
运行
复制
[JsonConverter(typeof(FooConverter))]
public class Foo
{
    public bool Bar { get; set; }
    public bool Baz { get; set; }
}
代码语言:javascript
运行
复制
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对象的表示形式更改为值数组,将其转换为值数组并将其序列化。

反序列化(阅读)在一般情况下可能要困难一些。但同样,我们的做法也是一样的。你需要一个布尔值数组。反序列化为数组并对其进行操作以创建对象。在这里,您可以执行一些验证,如果您想,如我所示。

这样,您应该能够很容易地转换到JSON字符串和从JSON字符串。

代码语言:javascript
运行
复制
var str = "[[true,true],[true,false]]";
var foos = JsonConvert.DeserializeObject<Foo[]>(str);
var serialized = JsonConvert.SerializeObject(foos);
票数 4
EN

Stack Overflow用户

发布于 2014-01-02 03:03:22

Json.NET中的序列化是记录在这里,包括JsonConverterAttribute类

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20875642

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档