【问题标题】:Passing Json information to object constructor when deserializing反序列化时将 Json 信息传递给对象构造函数
【发布时间】:2020-03-05 14:03:03
【问题描述】:

我有一个由嵌套的序列化对象组成的 Json 文件。
反序列化此文件时,我会根据需要重建嵌套对象,执行以下操作:

var SomeNestedObjects= JsonConvert.DeserializeObject<SomeNestedObjectsFormat>(File.ReadAllText(@"e:\file.json"));

现在,一切都很好,因为我的系统定义了所有这些嵌套对象,因此 JsonConverter 能够从该 Json 文件中的任何内容中创建和初始化批次。

我想做的是有一个空的虚拟模块,并根据在 Json 文件中找到的内容在运行时构建/构建/填充。我们以下面的Json文件为例,包含1个由2个参数组成的模块:

{
  "Name": "DummyModule",
  "param1": {
    "Value": 456,
    "Name": "Param1",
    "MinValue": 0,
    "MaxValue": 500
  },
  "param2": {
    "Value": false,
    "Name": "Param2",
    "MinValue": false,
    "MaxValue": true
  }
}

现在,我的系统有一个类 Parameter,但我的 DummyModule 类对 Param1 和 Param2 一无所知。原因是这个 DummyModule 可以由任何东西组成,并且可以在运行时更改。

所以我想做的是能够在我读取我的 Json 时在运行时向我的 DummyModule 添加属性。为了做到这一点,我需要在我的 DummyModule 构造函数中做一些魔法,基于从 Json 中读取的内容。
问题是我不知道我的构造函数如何访问或传递有关 Json 文件的信息。这是我的 DummyModule() 类:

public class DummyModule
{
    public string Name { get; set; }

    [JsonConstructor]
    public DummyModule()
    {
        // Use Json Object here to create/add my "Param1" and "Param2" properties on the fly
        // ...

        // Something of the sort:       
        foreach (var param in jsonObject)
            CreateProperty(tb, param.FieldName, param.FieldType);
    }
}

【问题讨论】:

  • 也许您能找到对这个问题有用的最佳答案:stackoverflow.com/questions/23017716/…
  • 谢谢,我以前做过类似的事情,但我希望不需要所有额外的逻辑。如果我可以将加载的 Json 数据传递给我的 DummyModule() 构造函数,而不需要所有这些。

标签: c# json object deserialization


【解决方案1】:

如果您的对象不必是 DummyModule 类型,您可以使用 ExpandoObject 作为目标类型来反序列化 JSON:

ExpandoObject 类使您能够在运行时添加和删除其实例的成员,还可以设置和获取这些成员的值。

dynamic myObject = JsonConvert.DeserializeObject<ExpandoObject>(File.ReadAllText(@"e:\file.json"));

Console.WriteLine(myObject.Name);
Console.WriteLine(myObject.Name.GetType());

Console.WriteLine(myObject.param1.Value);
Console.WriteLine(myObject.param1.Value.GetType());

这将是输出:

【讨论】:

  • 谢谢,是的,您需要模块库,因为它将包含方法(不能在 Json 中)。此外,还将混合定义明确的对象和 DummyModules。所以反序列化会打破这种方式。
猜你喜欢
  • 2016-03-24
  • 2014-06-04
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-17
  • 2012-07-09
  • 2011-09-13
相关资源
最近更新 更多