C# 如何自定义.Net中嵌套类的反序列化
假设我有:C# 如何自定义.Net中嵌套类的反序列化,c#,json,deserialization,C#,Json,Deserialization,假设我有: Class A { [JsonProperty(PropertyName = "label")] string _label; } Class B { [JsonProperty(PropertyName = "label")] string _label; [JsonProperty(PropertyName = "class_a")] A _a; } Class C { [JsonProperty(PropertyName
Class A
{
[JsonProperty(PropertyName = "label")]
string _label;
}
Class B
{
[JsonProperty(PropertyName = "label")]
string _label;
[JsonProperty(PropertyName = "class_a")]
A _a;
}
Class C
{
[JsonProperty(PropertyName = "label")]
string _label;
[JsonProperty(PropertyName = "class_b")]
B _b;
}
我可以将其序列化为json并发送到服务器:
{
label: "Label C"
class_b: {
label: "Label B"
class_a: {
label: "Label A"
}
}
}
但是,我从服务器获得的格式如下:
{
label: "Label C"
class_b: {
label: "Label B"
class_a: {
label: [
{
label0: "Label A"
}
]
}
}
}
您可以看到类_a中的标签被更改为数组而不是字符串,我需要自定义从json到类a的转换,以将数组转换回字符串。那么最好的处理方法是什么呢
我在考虑两种方法:
(一)
在每个类中实现一个静态方法来*:
class A {
public static A ToA(JToken token) {
label = token["label"][0]["label0"];
}
}
class B {
public static ToB(JToken token) {
label = token["label"];
_a = A.ToA(token["class_a"]);
}
}
class C {
public static ToC(Joken token) {
label = token["label"];
_b = B.ToB(token["class_b"])
}
}
(二)
实现定制的JsonConverter并重写ReadJson函数:
public class CustomizedJsonConverter : JsonConverter {
// This should do the normal converstion for class B and C, but customized convertion for class A
override ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) {}
}
问题:
1) 方法1听起来合理吗?
2) 我需要一些关于method2的指导,因为我不知道如何处理嵌套类我最近遇到了Newtonsoft的一个问题,当反序列化对象时,它向数组中添加了一个项。我不知道为什么。。。我知道这些类是嵌套的,并且我验证了序列化json是好的,编写了代码来立即对其进行反序列化,确定了它的范围,它确实出于某种原因修改了数组。我的想法是尽可能少地工作,因为在这一次之前,我对Newtonsoft有着丰富的经验。它似乎在嵌套数组和类方面存在问题。至于使用代币,你不必这么做。JsonConvert有一个重载来包含这些类型。@user2188649,是否您正在更改服务器上的序列化对象,从而得到这个结果?我制作了一个简单的代码片段,看看我是否正确地理解了您——正如您所看到的,它输出了您想要的结果。这就是你所需要的吗?@HeyJude,问题是服务器更改了A类的格式,因此,如果它引用了A类的定义,反序列化就不起作用了。@MichaelPuckettII,谢谢Michael,很高兴知道这一点。