【问题标题】:Map first three properties in JSON to class properties将 JSON 中的前三个属性映射到类属性
【发布时间】:2021-04-12 12:47:24
【问题描述】:

我有以下类,我想通过反序列化 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,并按上述方式获取其值。

【问题讨论】:

  • 您可以解析到JTokens 并遍历该树。
  • 可以使用相同的密钥吗?如果没有相同的,你可以去查字典和地图
  • @AlexeyRumyantsev 根据我的编辑,您有什么建议如何实施吗?
  • 这能回答你的问题吗? Deserialize json with known and unknown fields
  • @ChristophLütjen 我喜欢使用 [JsonExtensionData] 的解决方案。出于好奇,我想知道是否可以在不修改FirstThreeRandomProperties的接口的情况下解决这个问题?

标签: c# .net json.net


【解决方案1】:

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

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

var jObject = JObject.Parse(json);

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

From the 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>()
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-05
    • 2014-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-18
    • 2015-10-02
    • 1970-01-01
    相关资源
    最近更新 更多