在 C# 中从 json 中创建动态对象
Posted
技术标签:
【中文标题】在 C# 中从 json 中创建动态对象【英文标题】:Create dynamic Object in C# out of json 【发布时间】:2019-10-21 15:22:48 【问题描述】:我想用 Json 在 C# 中创建一个动态类。
我知道我可以反序列化以转换 json,但我的问题是:
如果我知道 json 的样子(例如 "id": "5", "name": "Example"
我可以使用 obj.id 或 obj.name 调用该值
但
我有一个带有一个属性数组的 JSON,它在每个实例中都可能不同。例如
"id": "5",
"name": "Example",
,
"config":
"Time": "13:23",
"Days": ["Monday", "Thuesday"]
或
"id": "5",
"name": "Example",
,
"config":
"ServerURL": "https://example.com",
"Category": "API"
那么我如何将这些不同的 JSON 转换为一个动态对象?
【问题讨论】:
编辑:只有字段“config”有不同的属性,其余的总是一样的 【参考方案1】: dynamic o = new ExpandoObject();
o.Time = "11:33";
var n = Newtonsoft.Json.JsonConvert.SerializeObject(o);
dynamic oa = Newtonsoft.Json.JsonConvert.DeserializeObject<ExpandoObject>(n);
Console.Write(oa.Time);
Console.Read();
【讨论】:
【参考方案2】:你可以这样做:
var jObj = JObject.Parse(jsonData);
jObj 成为您的“一个动态对象”,以访问更多属性:
var idObject= jObj["id"].ToObject<string>();
或者对于配置,你可以这样做:
var configInfo = jObj["config"].ToObject<Dictionary<string, string>>();
PS:我有类似的问题,你可以在JSON to object C# (mapping complex API response to C# object)查看问题并回答https://***.com/a/46118086/4794396
编辑:
您可能希望映射配置以将您的配置信息映射为 .ToObject<Dictionary<string, object>>()
之类的东西,因为它可以是任何东西..
【讨论】:
【参考方案3】:public class YourObject
public string id;
public string Example;
public YourConfig config;
public class YourConfig
public string Time;
public string[] Days;
public string ServerUrl;
public string Category;
如果您的 json 包含示例 ServerURl 并且 Category Time 天数将为空,Json 将根据属性(字段名称)转换您的对象,反之亦然。您可以根据 null 检查哪个 json 到达
【讨论】:
是的,但是如果我有 100 个不同的 Json 和不同的配置,那么我必须创建 100 个类,对吧? ExpandoObject 在 System.Dynamic 命名空间中查看用法 看我刚刚发布了答案【参考方案4】:您可以使用这种方法,这对我来说非常有效。
var vModel = JsonConvert.DeserializeObject<T>(JsonData, new IsDateTimeConverter DateTimeFormat = "dd/mm/yyyy", culture = cultureInfo.InvariantCulture);
【讨论】:
正如 OP 所说,由于结构在变化,还没有固定的T
。以上是关于在 C# 中从 json 中创建动态对象的主要内容,如果未能解决你的问题,请参考以下文章