Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何自定义.Net中嵌套类的反序列化_C#_Json_Deserialization - Fatal编程技术网

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,很高兴知道这一点。