首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从JSON初始化C#动态类型

从JSON初始化C#动态类型
EN

Stack Overflow用户
提问于 2017-04-13 10:26:12
回答 1查看 744关注 0票数 1

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

在我描述我的确切问题之前,我想举一个例子来说明我想要达到的目标。假设我有以下JSON:

代码语言:javascript
复制
{
    "Type": "AutoIncrementTag,
    "StartFrom": 0,
    "Skip": 10,
    "LeadingZero": false
}

因此,从Json中,我希望找到名为"AutoIncrementTag“的类并实例化它,将其"StartFrom”、"Skip“和"LeadingZero”参数设置为相应的值。

注释1: Json我有两个“标记”类,我想在Json字符串中的"Type“属性上实例化一个不同的类。

注释2: Json字符串将包含超过一个此类“描述”(我相信它们被称为JSON对象,但我还不太熟悉JSON格式)

注释3:我在所有Json解析/转换中使用Newtonsoft.Json。

所以现在轮到我了。

我设法获得Type属性

代码语言:javascript
复制
JObject.Parse(myJsonString).GetValue("Type").ToString();

但是,如何获得所有其他值--,因为它们将因所具有的类型不同而有所不同?(我需要一种动态迭代和获取其他属性的值的方法。)

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

代码语言:javascript
复制
Activator.CreateInstance(Type type, object[] args)

但是,如何(动态地)从json格式中描述的属性获得object[]。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-13 10:38:58

JSON.Net (即Newtonsoft.Json)已经为您完成了这一任务。例如,让我们从一个基本类开始:

代码语言:javascript
复制
public class Thing
{
    public int SomeValue { get; set; }
    public string AnotherValue { get; set; }
}

其中一个例子是:

代码语言:javascript
复制
var thing = new Thing { SomeValue = 5, AnotherValue = "blah" };

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

代码语言:javascript
复制
var settings = new JsonSerializerSettings
{
    TypeNameHandling = TypeNameHandling.All
};

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

它将给出如下的输出:

代码语言:javascript
复制
{
    "$type":"Thing, Namespace",
    "SomeValue": 5,
    "AnotherValue": "blah"
}

为了让它回到正确的对象中,只需使用相同的设置:

代码语言:javascript
复制
var anotherThing = JsonConvert.DeserializeObject(json, settings);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43389772

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档