是否有可能在反序列化时以某种方式捕获与任何 POCO 属性不匹配的剩余 JSON 数据?
Is it possible to catch somehow the remainder of JSON data that didn't match any POCO properties while deserializing?
我正在从外部 API 获取一些 JSON 数据。我有数据被反序列化到的 POCO 对象。我使用 System.Text.Json.JsonSerializer 进行反序列化。最近,我意识到我收到的 JSON 的结构发生了变化,这是我在检查其他东西时偶然发现的。我的问题是,是否有可能以某种方式捕获未成功映射到任何 POCO 字段的 json 数据?
为了更准确地回答我的问题,这里有一个 POCO 示例:
public class Car
{
public string Name { get; set; }
public int Age { get; set; }
}
JSON 我之前收到的:
{"Name" : "PinkCar", "Age": 3}
JSON 我现在收到:
{"Name" : "PinkCar", "Age": 3, "RogueField": "Loser"}
我希望至少能够在不中断反序列化过程的情况下以某种方式获得与任何 POCO 属性不匹配的新“RogueField”信息。
遗憾的是,目前无法使用 .NET Core 中的 System.Text.Json
对象。 It is currently unsupported.
不过您可以使用 Newtonsoft JSON,例如:
var settings = new JsonSerializerSettings
{
MissingMemberHandling = MissingMemberHandling.Error
};
var result = Newtonsoft.Json.JsonConvert.DeserializeObject<Car>(json, settings);
现在,当您的 POCO 遗漏任何字段时,它会抛出 JsonSerializationException
:
JsonSerializationException: Could not find member 'RogueField' on object of type 'Car'. Path 'RogueField', line 1, position 44.
额外的属性可以与您的对象一起保存在字典中。您可以操作此目录,再次序列化您的对象时将使用它。
来自 https://docs.microsoft.com/en-us/dotnet/standard/serialization/system-text-json-how-to#handle-overflow-json:创建一个 Dictionary<string, object>
类型的 属性,它可以有任何名称(大多数情况下它被命名为 ExtensionData 但可以是任何名称),并用[JsonExtensionData]
属性,例如:
public class Car
{
public string Name { get; set; }
public int Age { get; set; }
[JsonExtensionData]
public Dictionary<string, object> ExtensionData { get; set; }
}
我正在从外部 API 获取一些 JSON 数据。我有数据被反序列化到的 POCO 对象。我使用 System.Text.Json.JsonSerializer 进行反序列化。最近,我意识到我收到的 JSON 的结构发生了变化,这是我在检查其他东西时偶然发现的。我的问题是,是否有可能以某种方式捕获未成功映射到任何 POCO 字段的 json 数据?
为了更准确地回答我的问题,这里有一个 POCO 示例:
public class Car
{
public string Name { get; set; }
public int Age { get; set; }
}
JSON 我之前收到的:
{"Name" : "PinkCar", "Age": 3}
JSON 我现在收到:
{"Name" : "PinkCar", "Age": 3, "RogueField": "Loser"}
我希望至少能够在不中断反序列化过程的情况下以某种方式获得与任何 POCO 属性不匹配的新“RogueField”信息。
遗憾的是,目前无法使用 .NET Core 中的 System.Text.Json
对象。 It is currently unsupported.
不过您可以使用 Newtonsoft JSON,例如:
var settings = new JsonSerializerSettings
{
MissingMemberHandling = MissingMemberHandling.Error
};
var result = Newtonsoft.Json.JsonConvert.DeserializeObject<Car>(json, settings);
现在,当您的 POCO 遗漏任何字段时,它会抛出 JsonSerializationException
:
JsonSerializationException: Could not find member 'RogueField' on object of type 'Car'. Path 'RogueField', line 1, position 44.
额外的属性可以与您的对象一起保存在字典中。您可以操作此目录,再次序列化您的对象时将使用它。
来自 https://docs.microsoft.com/en-us/dotnet/standard/serialization/system-text-json-how-to#handle-overflow-json:创建一个 Dictionary<string, object>
类型的 属性,它可以有任何名称(大多数情况下它被命名为 ExtensionData 但可以是任何名称),并用[JsonExtensionData]
属性,例如:
public class Car
{
public string Name { get; set; }
public int Age { get; set; }
[JsonExtensionData]
public Dictionary<string, object> ExtensionData { get; set; }
}