Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.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# 将Json字符串反序列化为自定义.Net对象_C#_Json.net - Fatal编程技术网

C# 将Json字符串反序列化为自定义.Net对象

C# 将Json字符串反序列化为自定义.Net对象,c#,json.net,C#,Json.net,我有来自服务器的非常大的纯json,格式如下 { "A": 1, "B" : 2, "C" : 3 } public class MegaClass { public int A; public SetOfVariables1 Set1; } public class SetOfVariables1 { public int B; public int C; } 我不能改变格式 但不是制造一个超级级 public class MegaClass {

我有来自服务器的非常大的纯json,格式如下

{ "A": 1, "B" : 2, "C" : 3 }
public class MegaClass
{
    public int A;
    public SetOfVariables1 Set1;
}

public class SetOfVariables1
{
     public int B;
     public int C;
}
我不能改变格式

但不是制造一个超级级

public class MegaClass
{
    public int A;
    public int B;
    public int C;
}
我想将一些属性分组到另一个对象,如下所示

{ "A": 1, "B" : 2, "C" : 3 }
public class MegaClass
{
    public int A;
    public SetOfVariables1 Set1;
}

public class SetOfVariables1
{
     public int B;
     public int C;
}

有没有办法让这一切顺利

坏消息是,我想你不能动态地做到这一点。 好消息是,您可以自己处理反序列化并从中生成对象

我想你这样做是为了得到一个更好的结构,但是要知道,如果你想把对象恢复到原来的结构中,你必须编写自己的序列化程序

我找到了两种方法来达到你想要的结果。谈到Json.NET,我并不专业,事实上它对我来说是相当新的

代码来了:

class Program
{
    static void Main(string[] args)
    {
        String json = "{ 'A': 1, 'B' : 2, 'C' : 3 }";
        var classA = JsonConvert.DeserializeObject<MegaClass>(json,new AConverter());
        var classA2 = JsonConvert.DeserializeObject<MegaClass2>(json);
    }

    public class MegaClass2
    {
        public int A { get; set; }
        public SetOfVariables SetOfVariables1 { get; set; }

        public MegaClass2()
        {
            _additionalData = new Dictionary<string, JToken>();
            SetOfVariables1 = new SetOfVariables();
        }

        [JsonExtensionData]
        private IDictionary<string, JToken> _additionalData;

        [OnDeserialized]
        private void OnDeserialized(StreamingContext context)
        {
            int b = (int)_additionalData["B"];
            int c = (int)_additionalData["C"];

            SetOfVariables1.B = b;
            SetOfVariables1.C = c;
        }
    }

    public class MegaClass
    {
        public int A { get; set; }
        public SetOfVariables SetOfVariables1 { get; set; }
    }

    public class SetOfVariables
    {
        public int B { get; set; }
        public int C { get; set; }
    }

    public class AConverter : CustomCreationConverter<MegaClass>
    {
        public override MegaClass Create(Type objectType)
        {
            throw new NotImplementedException();
        }

        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            dynamic cl = serializer.Deserialize(reader);
            var classA = new MegaClass();
            classA.A = cl.A;
            var classB = new SetOfVariables();
            classB.B = cl.B;
            classB.C = cl.C;
            classA.SetOfVariables1 = classB;
            return classA;
        }
    }
}
类程序
{
静态void Main(字符串[]参数)
{
字符串json=“{A':1,'B':2,'C':3}”;
var classA=JsonConvert.DeserializeObject(json,new AConverter());
var classA2=JsonConvert.DeserializeObject(json);
}
公共类MegaClass2
{
公共int A{get;set;}
公共变量集变量集1{get;set;}
公共MegaClass2()
{
_additionalData=新字典();
SetOfVariables1=新的变量集();
}
[JsonExtensionData]
专用词典_附加数据;
[已序列化]
私有void已序列化(StreamingContext上下文)
{
int b=(int)u额外数据[“b”];
int c=(int)u额外数据[“c”];
变量集1.B=B;
变量集1.C=C;
}
}
公共类MegaClass
{
公共int A{get;set;}
公共变量集变量集1{get;set;}
}
公共类变量集
{
公共int B{get;set;}
公共int C{get;set;}
}
公共类转换程序:CustomCreationConverter
{
公共重写MegaClass创建(类型objectType)
{
抛出新的NotImplementedException();
}
公共重写对象ReadJson(JsonReader阅读器,类型objectType,对象existingValue,JsonSerializer序列化程序)
{
动态cl=序列化程序。反序列化(读取器);
var classA=新的MegaClass();
A类=A类;
var classB=新的变量集();
B类=B类;
类别B.C=类别C;
classA.SetOfVariables1=classB;
返回A类;
}
}
}
下面是描述: 第一个选项使用CustomCreationConverter。我们将对象反序列化为其原始表示形式,并从中创建一个新的表示形式

第二个选项似乎是在对象被反序列化后初始化它。 附加数据由框架设置,我们只需使用它来填充对象

我看到第一个选项被用来根据提供的json创建不同的对象。 例如,如果您有一个类a和类B,并且都扩展了类C,那么您可以在重写的
Create
方法中决定反序列化哪个对象


第一个选项的灵感来自Json.NET。坏消息是,我想你无法动态地实现这一点。 好消息是,您可以自己处理反序列化并从中生成对象

我想你这样做是为了得到一个更好的结构,但是要知道,如果你想把对象恢复到原来的结构中,你必须编写自己的序列化程序

我找到了两种方法来达到你想要的结果。谈到Json.NET,我并不专业,事实上它对我来说是相当新的

代码来了:

class Program
{
    static void Main(string[] args)
    {
        String json = "{ 'A': 1, 'B' : 2, 'C' : 3 }";
        var classA = JsonConvert.DeserializeObject<MegaClass>(json,new AConverter());
        var classA2 = JsonConvert.DeserializeObject<MegaClass2>(json);
    }

    public class MegaClass2
    {
        public int A { get; set; }
        public SetOfVariables SetOfVariables1 { get; set; }

        public MegaClass2()
        {
            _additionalData = new Dictionary<string, JToken>();
            SetOfVariables1 = new SetOfVariables();
        }

        [JsonExtensionData]
        private IDictionary<string, JToken> _additionalData;

        [OnDeserialized]
        private void OnDeserialized(StreamingContext context)
        {
            int b = (int)_additionalData["B"];
            int c = (int)_additionalData["C"];

            SetOfVariables1.B = b;
            SetOfVariables1.C = c;
        }
    }

    public class MegaClass
    {
        public int A { get; set; }
        public SetOfVariables SetOfVariables1 { get; set; }
    }

    public class SetOfVariables
    {
        public int B { get; set; }
        public int C { get; set; }
    }

    public class AConverter : CustomCreationConverter<MegaClass>
    {
        public override MegaClass Create(Type objectType)
        {
            throw new NotImplementedException();
        }

        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            dynamic cl = serializer.Deserialize(reader);
            var classA = new MegaClass();
            classA.A = cl.A;
            var classB = new SetOfVariables();
            classB.B = cl.B;
            classB.C = cl.C;
            classA.SetOfVariables1 = classB;
            return classA;
        }
    }
}
类程序
{
静态void Main(字符串[]参数)
{
字符串json=“{A':1,'B':2,'C':3}”;
var classA=JsonConvert.DeserializeObject(json,new AConverter());
var classA2=JsonConvert.DeserializeObject(json);
}
公共类MegaClass2
{
公共int A{get;set;}
公共变量集变量集1{get;set;}
公共MegaClass2()
{
_additionalData=新字典();
SetOfVariables1=新的变量集();
}
[JsonExtensionData]
专用词典_附加数据;
[已序列化]
私有void已序列化(StreamingContext上下文)
{
int b=(int)u额外数据[“b”];
int c=(int)u额外数据[“c”];
变量集1.B=B;
变量集1.C=C;
}
}
公共类MegaClass
{
公共int A{get;set;}
公共变量集变量集1{get;set;}
}
公共类变量集
{
公共int B{get;set;}
公共int C{get;set;}
}
公共类转换程序:CustomCreationConverter
{
公共重写MegaClass创建(类型objectType)
{
抛出新的NotImplementedException();
}
公共重写对象ReadJson(JsonReader阅读器,类型objectType,对象existingValue,JsonSerializer序列化程序)
{
动态cl=序列化程序。反序列化(读取器);
var classA=新的MegaClass();
A类=A类;
var classB=新的变量集();
B类=B类;
类别B.C=类别C;
classA.SetOfVariables1=classB;
返回A类;
}
}
}
下面是描述: 第一个选项使用CustomCreationConverter。我们将对象反序列化为其原始表示形式,并从中创建一个新的表示形式

第二个选项似乎是在对象被反序列化后初始化它。 额外数据由框架a设置