C# 将Json字符串反序列化为自定义.Net对象
我有来自服务器的非常大的纯json,格式如下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 {
{ "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设置