使用 Json.NET 对类型 T 进行序列化和反序列化,派生自字典<字符串 T>



我创建了一个示例项目。我正在序列化以下类型:

[JsonObject(IsReference = true, ItemReferenceLoopHandling = ReferenceLoopHandling.Serialize)]
public class SampleTree : Dictionary<string, SampleTree>
{
    [JsonProperty(ReferenceLoopHandling = ReferenceLoopHandling.Serialize)]
    public SampleClass Value { get; set; }
    [JsonProperty(IsReference = true, ReferenceLoopHandling = ReferenceLoopHandling.Serialize)]
    public SampleTree Parent { get; set; }
}
[JsonObject(IsReference = true)]
public class SampleClass
{
    public string A { get; set; }
    public int B { get; set; }
    public bool C { get; set; }
}

程序代码(为简单起见,控制台应用程序):

static void Main(string[] args)
{
    var tree = new SampleTree
    {
        Value = new SampleClass
        {
            A = "abc",
            B = 1,
            C = true
        },
        Parent = null
    };
    var treeChild = new SampleTree
    {
        Value = new SampleClass
        {
            A = "def",
            B = 2,
            C = false
        },
        Parent = tree
    };
    tree.Add("firstChild", treeChild);
    var serializerSettings = new JsonSerializerSettings
    {
        PreserveReferencesHandling = PreserveReferencesHandling.All,
        ReferenceLoopHandling = ReferenceLoopHandling.Serialize,
        Formatting = Formatting.Indented
    };
    var serialized = JsonConvert.SerializeObject(tree, serializerSettings);
    var deserialized = JsonConvert.DeserializeObject<SampleTree>(serialized, serializerSettings);
    var d = deserialized;
}

序列化的结果非常完美:结果字符串包含我之前放入树中的所有数据。但是,使用相同的序列化程序设置对该字符串进行反序列化是不正确的:结果对象根本没有子对象。也许主要问题是属性...这种行为的原因是什么?

我不确定这是你需要的。

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Dictionary<string, SampleTree> tree = new Dictionary<string, SampleTree>();
            var a = new SampleTree
            {
                Value = new SampleClass
                {
                    A = "abc",
                    B = 1,
                    C = true
                },
                Parent = null
            };
            var treeChild = new SampleTree
            {
                Value = new SampleClass
                {
                    A = "def",
                    B = 2,
                    C = false
                },
                Parent = a
            };
            tree.Add("parent", a);
            tree.Add("child", treeChild);
            var serializerSettings = new JsonSerializerSettings
            {
                PreserveReferencesHandling = PreserveReferencesHandling.All,
                ReferenceLoopHandling = ReferenceLoopHandling.Serialize,
                Formatting = Formatting.Indented
            };
            var serialized = JsonConvert.SerializeObject(tree, serializerSettings);
            var deserialized = JsonConvert.DeserializeObject<Dictionary<string, SampleTree>>(serialized, serializerSettings);
            var d = deserialized;
        }
    }
    [JsonObject(IsReference = true, ItemReferenceLoopHandling = ReferenceLoopHandling.Serialize)]
    public class SampleTree
    {
        [JsonProperty(ReferenceLoopHandling = ReferenceLoopHandling.Serialize)]
        public SampleClass Value { get; set; }
        [JsonProperty(IsReference = true, ReferenceLoopHandling = ReferenceLoopHandling.Serialize)]
        public SampleTree Parent { get; set; }
    }
    [JsonObject(IsReference = true)]
    public class SampleClass
    {
        public string A { get; set; }
        public int B { get; set; }
        public bool C { get; set; }
    }
}

这对我来说完美无缺。让我知道这是否是您想要的。

我没有

在 Main 函数中声明字典,而是在 SampleTree 本身中添加了一个名为字典类型的子属性(并删除了继承 ofc)。

相关内容

  • 没有找到相关文章

最新更新