我正在创建对象来存储我将要接收的JSON数据,并且无法找出构造对象的正确方法。基本上,我可以接收两个只有身体差异的不同对象,所以我希望建立一个基类。
public class SampleBase
{
public string url { get; set; }
public string resource { get; set; }
public string Body body { get; set; }
}
这是基础的一个例子,Body对象在
下面声明public abstract class Body{ }
然后我有两个单独的文件用于我可以接收的基础对象的版本,下面是一个例子:
public class SampleObject : SampleBase
{
public class Body
{
public string bodyproperty { get; set; }
}
}
我这样做只是为了提高类的效率,因为它们共享一些属性。永远不会调用SampleBase类,而是将传入的json反序列化为SampleObject。这是最佳做法吗?
编辑:通过这个例子,JSON收到
{
"url": "xxxxxxxxxx",
"resource": "xxxxxxx",
"body": {
"bodyproperty": "xxxx",
}
}
答案 0 :(得分:0)
您的类结构很大程度上取决于您选择的序列化程序。例如,DataContractJsonSerializer
在技术上可以处理继承的类,但它有点笨重的方式。您需要在基本类型上定义基类型的所有已知继承者。
就个人而言,我会在你的情况下使用组合而不是继承。以下是使用DataContractJsonSerializer
:
[DataContract]
public class Wrapper<T> where T : Body
{
[DataMember(Name = "url")]
public string Url { get; set; }
[DataMember(Name = "resource")]
public string Resource { get; set; }
[DataMember(Name = "body")]
public string T Body { get; set; }
}
[DataContract]
public class Body
{
[DataMember(Name = "bodyproperty")]
public string BodyProperty { get; set; }
}
然后你就像任何其他通用一样使用这个类。
Wrapper<Body> obj = new Wrapper<Body>();
编辑:由于这是一个MVC应用程序,您可能正在使用JavascriptSerializer
。可以忽略DataContract
和DataMember
,但类的结构仍然相关。
var serializer = new JavaScriptSerializer();
var data = serializer.Deserialize<Wrapper<Body>>(json);