JSON数据的基类

时间:2017-07-17 19:35:41

标签: c# json

我正在创建对象来存储我将要接收的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", 
          }
}

1 个答案:

答案 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。可以忽略DataContractDataMember,但类的结构仍然相关。

var serializer = new JavaScriptSerializer();
var data = serializer.Deserialize<Wrapper<Body>>(json);