在下面的代码中,我手动创建一个符合我们标准 json 响应对象格式的 json 对象,该格式对于错误和实际响应都是相同的:
{
数据:{/*某事*/},
状态:{httpCode:123,消息:“错误消息”}
}
如何配置 ASP.NET 来为我执行此格式设置?显然可以使用标准 JSON and XML formatter 来实现此目的在进行内容协商时,但链接的文章仅指向 page on Custom Formatters这是空白的(对于我没有使用的 ASP.NET MVC 也是如此)...
我还希望它能够在响应对象中设置返回的http代码(如下所示)。
当前 json 的手动格式化
[StandardizedRestServiceExceptionFilter]
public class FooController : ApiController
{
/// <summary>
///
/// The return format for both real results and errors
/// is { data : { }, status : { httpCode : 123, message: "error message" }
///
/// We have moved the error serialization to StandardizedRestServiceExceptionFilter,
/// but was unable to generalize the processing of the output format for normal responses
/// That could be improved, possibly using a IMessageFormatter ?
/// </summary>
/// <param name="code"></param>
/// <returns></returns
[HttpGet]
public JObject Coverage(string code)
{
dynamic returnObject = new JObject();
dynamic statusObject = new JObject();
dynamic dataObject = new JObject();
JArray stores = StoresWithCoverage(code);
var hasCoverage = stores.Count > 0;
dataObject.coverage = hasCoverage;
returnObject.data = dataObject;
returnObject.status = statusObject;
statusObject.message = "";
statusObject.httpCode = 200;
return returnObject;
}
}
}
因此,在上面的示例中,我希望能够仅返回具有 coverage
属性的某种对象,并让 ASP.NET 执行实际的格式化和序列化为 JSON(如果在内容协商)。
最佳答案
可以使用预构建或自定义 Media Formatters使用 ASP.NET Web API。
在这种情况下,可以以上面链接中的自定义格式化程序为例,并根据需要修改 JSON 内容包装器(此处:使用 JSON.NET ):
首先您需要指定您支持的内容类型:
public CustomJsonFormatter()
{
// Add the supported media type.
SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/json"));
}
然后您需要实现对 WriteToStream
方法的重写:
public override void WriteToStream(Type type, object value, Stream writeStream, HttpContent content)
{
using (var writer = new StreamWriter(writeStream, effectiveEncoding))
{
using (JsonWriter jw = new JsonTextWriter(writer))
{
dynamic returnObject = new JObject();
dynamic status = new JObject();
JObject data = (JObject)JToken.FromObject(value);
status.httpCode = HttpContext.Current.HttpResponse.StatusCode;
status.message = null;
returnObject.data = data;
returnObject.status = status;
jw.Formatting = Formatting.Indented;
JsonSerializer serializer = new JsonSerializer();
// for customizing settings, like lower casing
// attribute names, see http://stackoverflow.com/a/6288726/200987
serializer.ContractResolver = new CamelCasePropertyNamesContractResolver()
serializer.Serialize(jw, returnObject);
}
}
}
最后需要说明哪种类型支持转换、向 ASP.NET 注册此格式化程序以及其他一些较小的(通常是非必需的)修改。请参阅以下文章,了解如何执行此操作,以及序列化、http 状态代码和内容协商的工作原理以及自定义方式。
关于asp.net - 如何使用自定义格式化程序进行 json 序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39892341/