2017-02-10 66 views
-1

我正在编写一个web api使用我现有的模型类和模型服务,也正在被许多其他应用程序使用,这需要模型完全暴露在序列化中。我可以为web api使用相同的模型对象,并只显示几个字段。c#避免嵌套类对象的子属性的序列化

我已经尝试使用JsonContractResolver,但它无法序列化嵌套类中的子属性。

/*Model class*/ 
    public class A 
    { 
    public int A1 { get; set; } 
    public DateTime A2 { get; set; } 
    public List<B> A3 { get; set; } 
    } 
    public class B 
    { 
    public string B1 { get; set; } 
    public string B2 { get; set; } 
    public string B3 { get; set; } 
    } 

预期输出: 当Web应用程序的方法得到类A的成员,它应该返回以下JSON:

{"A1":1,"A2":"2017-02-10","A3":[{"B1":"test1","B2":"test2","B3":"test3"}]} 

当web API获取类A的成员,它应该退货:

{"A1":1,"A3":[{"B1":"test1"}]} 

请指教应该采取什么样的最佳方法。

+1

_“使用相同的模型对象的Web API和只露出几个字段” _ - 使用的ViewModels,使用匿名类型或[使用每个应用程序或端点的自定义序列化程序](http://stackoverflow.com/questions/25157511/newtonsoft-add-jsonignore-at-runtime)。你的研究表明了什么? – CodeCaster

回答

0

每个域都应该有自己的模型/类。 Web应用程序应该有一个暴露所有字段的模型,并且web api应该只有一个只显示部分字段的模型。

namespace X.WebApp.Models { 

    public class A { 
     public int A1 { get; set; } 
      public DateTime A2 { get; set; } 
      public List<B> A3 { get; set; } 
    } 

    public class B { 
     public string B1 { get; set; } 
      public string B2 { get; set; } 
      public string B3 { get; set; } 
    } 
} 

namespace X.WebApi.Models { 

    public class A { 
     public int A1 { get; set; } 
      public List<B> A3 { get; set; } 
    } 

    public class B { 
     public string B1 { get; set; } 
    } 
} 

这些模型可以从一个更普遍的车型命名空间中建立

namespace X.Common.Models { 

    public class A { 
     public int A1 { get; set; } 
      public DateTime A2 { get; set; } 
      public List<B> A3 { get; set; } 
     // More fields... 
    } 

    public class B { 
     public string B1 { get; set; } 
      public string B2 { get; set; } 
      public string B3 { get; set; } 
     // More fields... 
    } 
}