Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将对象序列化为数组_C#_Json.net - Fatal编程技术网

C# 将对象序列化为数组

C# 将对象序列化为数组,c#,json.net,C#,Json.net,我有一个C#object。我想将其序列化为数组,而不是键值映射 我的C#类: 所需的JSON输出: [true,false] 实际的JSON输出(如果删除顶部的JsonArray属性): 我在一个复杂的对象层次结构中有大量的对象,我需要将它们序列化为数组,而不是键值映射。我更喜欢一个解决方案,它不要求进行序列化的东西知道它正在序列化什么。我希望能够在顶级对象上调用JsonConvert.SerializeObject(myThing),并使所有子对象由于其自身的属性而正确序列化 目前,我的所有

我有一个C#object。我想将其序列化为数组,而不是键值映射

我的C#类:

所需的JSON输出:

[true,false]
实际的JSON输出(如果删除顶部的JsonArray属性):

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

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


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

Json.NET中的序列化包括JsonConverterAttribute类

以下是编写此类转换器的方法

[JsonConverter(typeof(FooConverter))]
public class Foo
{
    public bool Bar { get; set; }
    public bool Baz { get; set; }
}
{"Bar":true,"Baz":false}
[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);
    }
}
var str = "[[true,true],[true,false]]";
var foos = JsonConvert.DeserializeObject<Foo[]>(str);
var serialized = JsonConvert.SerializeObject(foos);