在输出为Json之前从Dto过滤属性

时间:2011-06-03 17:33:02

标签: json model-view-controller serialization

我有一个用于公开引用数据的REST API。有时API可以采用特定参数来提供数据。

一般用法:http://blah.com/quotes?symbol=MSFT

具体用法:http://blah.com/quotes?symbol=MSFT&params=[Symbol,Sector,Industry]

DTO:

public class QuoteDto 
{
    public string CompanyName { get; private set; }
    public string Symbol { get; private set; }
    public string Exchange { get; private set; }
    public string Sector { get; private set; }
    public string Industry { get; private set; }
    . . . 
}

在一般用法中我只是将我的DTO序列化为Json。但是当我得到特定的请求时,如何在序列化之前从我的dto中过滤掉不需要的参数?

是否有任何第三方lib来执行此操作?我可以使用反射,但这是不可思议的方式。 我正在使用ASP.NET MVC和C#

2 个答案:

答案 0 :(得分:0)

混合使用两种技巧 - 首先是编写自己的json结果。

Control serializer in JsonResult aka Json function in ASP.Net MVC?

http://brianreiter.org/2011/01/03/custom-jsonresult-class-for-asp-net-mvc-to-avoid-maxjsonlength-exceeded-exception/

其次,不要使用ex。 javascriptserializer,你会反过来使用JSON.Net手动进行序列化。这样,您可以根据规则排除所需的任何属性。来自其网站的代码块显示其序列化非常简单 http://james.newtonking.com/projects/json/help/ReadingWritingJSON.html

StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);

using (JsonWriter jsonWriter = new JsonTextWriter(sw))
{
  jsonWriter.Formatting = Formatting.Indented;
  jsonWriter.WriteStartObject();
  jsonWriter.WritePropertyName("CPU");
  jsonWriter.WriteValue("Intel");

  jsonWriter.WritePropertyName("PSU");
  jsonWriter.WriteValue("500W");

  jsonWriter.WritePropertyName("Drives");
  jsonWriter.WriteStartArray();

  jsonWriter.WriteValue("DVD read/writer");
  jsonWriter.WriteComment("(broken)");

  jsonWriter.WriteValue("500 gigabyte hard drive");
  jsonWriter.WriteValue("200 gigabype hard drive");

  jsonWriter.WriteEnd();

  jsonWriter.WriteEndObject();

}

答案 1 :(得分:0)

我使用NHibernate相当多,但它比我需要发送JSON中的所有内容更多。

虽然hacky,我喜欢使用Dictionary<string, object>,然后只添加我想发送的成员。

return Json(someDict);