使用C#从JSON创建动态对象

5

我想用C#从Json中创建一个动态类。我知道可以使用反序列化来转换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”具有不同的属性,其余部分始终相同。 - Johannes Zeiße
4个回答

6
        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();

5
你可以这样做:
var jObj = JObject.Parse(jsonData);

而jObj成为您的“一个动态对象”,以访问更多属性:

var idObject= jObj["id"].ToObject<string>();

或者针对配置,您可以执行以下操作:

var configInfo = jObj["config"].ToObject<Dictionary<string, string>>();

PS:我有类似的问题,你可以查看JSON转换C#对象(将复杂API响应映射到C#对象)的问题和答案https://stackoverflow.com/a/46118086/4794396

编辑: 您可以使用.ToObject<Dictionary<string, object>>()将配置映射为一个字典,因为它可能是任何东西。


0
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 将根据属性(字段名称)转换您的对象,其中 days 为 null,反之亦然。您可以基于 null 检查到达的 JSON。


如果我有100个不同配置的Json,那么我需要制作100个类,是吗? - Johannes Zeiße
1
ExpandoObject 在 System.Dynamic 命名空间中的使用方法。 - auslander
看,我刚刚发布了答案。 - auslander

-2

你可以使用这种方法,这对我来说非常完美。

    var vModel = JsonConvert.DeserializeObject<T>(JsonData, new IsDateTimeConverter { DateTimeFormat = "dd/mm/yyyy", culture = cultureInfo.InvariantCulture});

1
正如OP所提到的,由于结构正在发生变化,因此尚未确定固定的“T”。 - poke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接