【问题标题】:Create dynamic Object in C# out of json在 C# 中从 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”有不同的属性,其余的总是一样的

标签: c# json asp.net-core dynamic


【解决方案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://stackoverflow.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
      猜你喜欢
      • 2016-10-02
      • 1970-01-01
      • 1970-01-01
      • 2017-05-04
      • 2012-05-02
      • 2014-06-03
      • 1970-01-01
      • 1970-01-01
      • 2021-12-29
      相关资源
      最近更新 更多