来自JSON的C#动态类型初始化

时间:2017-04-13 10:26:13

标签: c# json parsing dynamic reflection

我正在尝试基于JSON字符串从我的visual studio解决方案动态实例化一个类。

在我描述我的确切问题之前,我想举例说明我想要实现的目标。 假设我有以下JSON:

{
    "Type": "AutoIncrementTag,
    "StartFrom": 0,
    "Skip": 10,
    "LeadingZero": false
}

所以从那个Json,我想找到名为“AutoIncrementTag”的类并实例化它,设置它的“ StartFrom ”,“ Skip ”和“ LeadingZero “对应的correspoding值。

注1:我有几个theese“Tag”类,我想在我的Json字符串中的“Type”属性上实例化一个不同的。

注2:我的Json字符串将包含多个这些类“描述”(我相信它们被称为JSON对象,但我还不太熟悉JSON格式)< / p>

注3 :我正在使用Newtonsoft.Json进行所有Json解析/转换。

所以,现在我的问题。

我设法使用

获取Type属性
JObject.Parse(myJsonString).GetValue("Type").ToString();

然而,我将如何获得所有其他值,因为根据我的类型,它们会有所不同? (我需要一种动态迭代并获取其他属性值的方法。)

其次,我如何将这些属性映射到C#对象。 我想过使用

Activator.CreateInstance(Type type, object[] args)

我如何(动态)从我的json格式中描述的属性中获取对象[]。

1 个答案:

答案 0 :(得分:2)

JSON.Net(即Newtonsoft.Json)已为您完成此操作。例如,让我们从基础类开始:

public class Thing
{
    public int SomeValue { get; set; }
    public string AnotherValue { get; set; }
}

它的一个例子:

var thing = new Thing { SomeValue = 5, AnotherValue = "blah" };

我们可以使用自定义设置对象进行反序列化,特别是设置TypeNameHandling属性

var settings = new JsonSerializerSettings
{
    TypeNameHandling = TypeNameHandling.All
};

var json = JsonConvert.SerializeObject(thing, settings);

这将给出类似的输出:

{
    "$type":"Thing, Namespace",
    "SomeValue": 5,
    "AnotherValue": "blah"
}

要将其恢复到正确的对象类型,只需使用相同的设置:

var anotherThing = JsonConvert.DeserializeObject(json, settings);