在 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&lt;Dictionary&lt;string, object&gt;&gt;() 之类的东西,因为它可以是任何东西..

【讨论】:

【参考方案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 中创建动态对象的主要内容,如果未能解决你的问题,请参考以下文章

在c#中创建一个json请求对象

在 C# 中创建一个每次都可以具有不同属性的类或对象

如何在反应钩子中创建一个新的 JSON 对象?

在 c# 中从图像中创建具有特定像素格式的位图而不加载图像

C# 动态类型 Object 属性 First 始终为 null

在 C# 中从 base64 反序列化对象