首页 > 解决方案 > Json.NET 填充一个类,而不是另一个

问题描述

我正在尝试ParticleSystem使用 Json.Net 填充我的对象对象,如下所示:

public void LoadJson(string path, object targetObject)
{
   using (var sw = new StreamReader(path))
        using (var reader = new JsonTextReader(sw))
            JsonHelpers.DefaultSerializer.Populate(reader, targetObject);
}

使用以下 json 文件:

{
  "TexturePath": "Particles/snow",
  "MaxParticles": 8500
}

这是课程的一部分(整个内容太大,无法发布)

public class ParticleSystem : Entity3D
{
        public int MaxParticles;
        public string TexturePath { get; set; } = "Textures/default_diffuse";

        public void Load()
        {
            LoadJson("Data/Particles/SnowSettings.json", this);
        }
        etc...
}

但是,无论我尝试以何种方式调用该LoadJson()方法,都不会将值填充到对象中。

当我这样创建一个新类并以完全相同的方式调用它时,使用相同的文件和相同的方法完全按照预期填充该类。我添加了一些父类来测试继承是否破坏了任何东西,因为原始类有几个继承。

    class TestClass : sub<float>
    {
        public int MaxParticles;
        public string TexturePath { get; set; } = "Textures/default_diffuse";

        public void Load()
        {
            LoadJson("Data/Particles/SnowSettings.json", this);
        }
    }
    class sub<T> : sub2
    {

    }
    class sub2
    {

    }

这可能是什么原因造成的?我启用了错误记录,但我什么也没得到。有什么方法可以记录什么是/没有被填充?或者我怎样才能调试这个并找到原来没有被填充的原因?

编辑和回答:

在对相当复杂的层次结构树进行调查后,它是其中的一部分,因此无法完全发布,我终于找到了导致我的问题的原因。事实证明,其中一个基类具有以下属性:

[JsonObject(MemberSerialization.OptIn)]

具有以下描述

只有标有 Newtonsoft.Json.JsonPropertyAttribute 或 System.Runtime.Serialization.DataMemberAttribute 的成员才会被序列化。此成员序列化模式也可以通过使用 System.Runtime.Serialization.DataContractAttribute 标记类来设置。

虽然我可以看到这如何影响序列化,但它认为这还包括反序列化并不完全清楚,Populate()即使它们存在于 JSON 文件中,甚至方法也会忽略它们。我认为这至少应该记录在 Tracer 中以找到这种行为。

我已将答案标记为启用Tracer答案,并在此处针对我的具体情况提供这些详细信息,因为该答案回答了我提出的实际问题。

标签: c#json.net

解决方案


要找出序列化中出了什么问题,您可以使用tracking

TraceWriter序列化程序的属性设置为可以扫描可疑消息的跟踪器。

例如:

public void LoadJson(string path, object targetObject)
{
   using (var sw = new StreamReader(path))
   {
        using (var reader = new JsonTextReader(sw))
        {
            var traceWriter = new MemoryTraceWriter();
            var serializer = JsonHelpers.DefaultSerializer;

            serializer.TraceWriter = traceWriter;
            serializer.Populate(reader, targetObject);

            Console.WriteLine(traceWriter);
        }
    }
}

这并不完全是最佳实践,但它应该在调试过程中提示您的问题所在。


推荐阅读