1

我有以下类,我想通过反序列化 JSON 文件来填充其字段:

public class FirstThreeRandomProperties
{
   public List<string> extras1;
   public List<string> extras2;
   public List<string> extras3;
}

不幸的是,我希望反序列化的 JSON 具有带有变量名的属性。我希望能够反序列化以下 JSON:

{
   'unknownName1': [ "A" ],
   'unknownName1': [ "A", "B", "C" ]
}

如您所见,属性的名称是随机的,但属性始终是字符串数组。我想将前三个映射到 ThreeExtras 中的变量并丢弃其余的(如果超过三个)。我希望将其映射到:

{
   'extras1': [ "A" ],
   'extras2': [ "A", "B", "C" ],
   'extras3': null
}

这可能吗?

编辑: FirstThreeRandomProperties 实际上是另一个对象的成员,如下所示:

public class ParentObject
{
   // Other properties
   public FirstThreeRandomProperties extraProperties;
}

因此,我更喜欢一种解决方案,该解决方案可以轻松地让我用 extraProperties 填充 ParentObject 获取其值,如上所述。

4

1 回答 1

0

以下是如何将 json 反序列化为 FirstThreeRandomProperties 类:

var json = "{\"extras1\":[\"A\"],\"extras2\":[\"A\",\"B\",\"C\"],\"extras3\":null}";

var jObject = JObject.Parse(json);

var firstThreeRandomProperties = jObject.ToObject<FirstThreeRandomProperties>();

从 docs中,这将创建一个指定 .NET 类型的实例。它会自动尝试将第一个标记映射到您的类的第一个属性,依此类推。例如,如果您的属性是一个对象,但 JToken 是一个数组,则该属性将为 null,因为它无法进行映射。如果您需要此方法可靠,则必须确定 JSON 的每个标记与您的类中的属性具有相同的类型。否则,您将不得不遍历所有令牌并进行所需的检查。

这将导致:

在此处输入图像描述

如果您需要直接反序列化为 ParentObject 类,则 JSON 应如下所示:

{
  "extraProperties": {
    "extras1": [ "A" ],
    "extras2": [ "A", "B", "C" ],
    "extras3": null 
  }
}

你可以这样做:

jObject.ToObject<ParentObject>();

否则,您所要做的就是:

var parentObject = new ParentObject
{
    ExtraProperties = jObject.ToObject<FirstThreeRandomProperties>()
};
于 2021-04-12T14:45:46.087 回答