Dan*_*fer 31 asp.net-mvc serialization json
有没有办法控制JsonResult
带属性的JSON输出,类似于你如何使用它们XmlElementAttribute
以及它的bretheren来控制XML序列化的输出?
例如,给定以下类:
public class Foo
{
[SomeJsonSerializationAttribute("bar")]
public String Bar { get; set; }
[SomeJsonSerializationAttribute("oygevalt")]
public String Oygevalt { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我想得到以下输出:
{ bar: '', oygevalt: '' }
Run Code Online (Sandbox Code Playgroud)
相反:
{ Bar: '', Oygevalt: '' }
Run Code Online (Sandbox Code Playgroud)
Dan*_*fer 38
我想要一些比Jarrett建议更多的东西,所以这就是我所做的:
JsonDataContractActionResult:
public class JsonDataContractActionResult : ActionResult
{
public JsonDataContractActionResult(Object data)
{
this.Data = data;
}
public Object Data { get; private set; }
public override void ExecuteResult(ControllerContext context)
{
var serializer = new DataContractJsonSerializer(this.Data.GetType());
String output = String.Empty;
using (var ms = new MemoryStream())
{
serializer.WriteObject(ms, this.Data);
output = Encoding.Default.GetString(ms.ToArray());
}
context.HttpContext.Response.ContentType = "application/json";
context.HttpContext.Response.Write(output);
}
}
Run Code Online (Sandbox Code Playgroud)
JsonContract()方法,添加到我的基本控制器类:
public ActionResult JsonContract(Object data)
{
return new JsonDataContractActionResult(data);
}
Run Code Online (Sandbox Code Playgroud)
样品用法:
public ActionResult Update(String id, [Bind(Exclude="Id")] Advertiser advertiser)
{
Int32 advertiserId;
if (Int32.TryParse(id, out advertiserId))
{
// update
}
else
{
// insert
}
return JsonContract(advertiser);
}
Run Code Online (Sandbox Code Playgroud)
注意:如果您正在寻找比JsonDataContractSerializer更高性能的东西,您可以使用JSON.NET来做同样的事情.虽然JSON.NET似乎没有使用DataMemberAttribute,但它确实有自己的JsonPropertyAttribute,它可以用来完成同样的事情.
Cha*_*ian 16
这是我对Daniel Schaffer的回答的实现,以及Justin Rusbatch和Daniel合并的建议改进.
using System;
using System.Runtime.Serialization.Json;
using System.Web.Mvc;
public class JsonDataContractActionResult : JsonResult
{
public JsonDataContractActionResult( Object data )
{
this.Data = data;
}
public override void ExecuteResult( ControllerContext context )
{
var serializer = new DataContractJsonSerializer( this.Data.GetType() );
context.HttpContext.Response.ContentType = "application/json";
serializer.WriteObject( context.HttpContext.Response.OutputStream,
this.Data );
}
}
Run Code Online (Sandbox Code Playgroud)
这是使用 NewtonSoft Json.Net(为了性能)的解决方案,我在这里和 SO 上找到了部分解决方案
public class JsonNetResult : ActionResult
{
public Encoding ContentEncoding { get; set; }
public string ContentType { get; set; }
public object Data { get; set; }
public JsonSerializerSettings SerializerSettings { get; set; }
public Formatting Formatting { get; set; }
public JsonNetResult(object data, Formatting formatting)
: this(data)
{
Formatting = formatting;
}
public JsonNetResult(object data):this()
{
Data = data;
}
public JsonNetResult()
{
Formatting = Formatting.None;
SerializerSettings = new JsonSerializerSettings();
}
public override void ExecuteResult(ControllerContext context)
{
if (context == null)
throw new ArgumentNullException("context");
var response = context.HttpContext.Response;
response.ContentType = !string.IsNullOrEmpty(ContentType)
? ContentType
: "application/json";
if (ContentEncoding != null)
response.ContentEncoding = ContentEncoding;
if (Data == null) return;
var writer = new JsonTextWriter(response.Output) { Formatting = Formatting };
var serializer = JsonSerializer.Create(SerializerSettings);
serializer.Serialize(writer, Data);
writer.Flush();
}
}
Run Code Online (Sandbox Code Playgroud)
所以在我的控制器中,我可以做到这一点
return new JsonNetResult(result);
Run Code Online (Sandbox Code Playgroud)
在我的模型中,我现在可以拥有:
[JsonProperty(PropertyName = "n")]
public string Name { get; set; }
Run Code Online (Sandbox Code Playgroud)
请注意,现在,您必须将 设置为JsonPropertyAttribute
要序列化的每个属性。
小智 5
我知道这是一个老问题,但对于那些寻求如何避免序列化属性的人,请使用命名空间System.Web.Script.Serialization中的ScriptIgnoreAttribute.遗憾的是仍然无法控制序列化属性的名称,但有人可能会发现这有用.
public class MyClass {
[ScriptIgnoreAttribute]
public bool PropertyNotSerialized { get; set; }
public bool AnyProperty { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
输出为Json的结果如下:
{"AnyProperty ": false}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
23192 次 |
最近记录: |