asp.net - 如何使用自定义格式化程序进行 json 序列化

标签 asp.net asp.net-web-api

在下面的代码中,我手动创建一个符合我们标准 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/

相关文章:

asp.net - 发布期间的 ERROR_USER_NOT_AUTHORIZED_FOR_DBFULLSQL

asp.net - ASP.NET MVC 6 项目中的 LIB 文件夹

c# - .Net Web API 路由和帮助页面

javascript - Web API - Controller 设计

security - 如何使用Web API限制DOS攻击

firefox - ASP.NET Web API CORS 在 Chrome 和 Safari 中运行良好,但在 Firefox 中运行不正常

asp.net - Javascript 数据绑定(bind)和 SEO

c# - 帮助 sql select 语法

c# - 两个更新面板

asp.net-mvc-4 - 使用 WebAPI 搜索