如何使用自定义格式化程序进行JSON序列化

少尿的

在下面的代码中,我手动创建一个遵循我们标准json响应对象格式的json对象,这对于错误和实际响应都是相同的:

{ data : { /*something*/ }, status : { httpCode : 123, message: "error message" } }

如何配置ASP.NET为我做这种格式化?显然,它可以在进行内容协商时使用标准的JSON和XML格式化程序来执行此操作,但是链接的文章仅指向自定义格式化程序上的空白页面(对于我未使用的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属性的某种Object,并让ASP.NET对JSON进行实际的格式设置和序列化(如果在内容协商中要求)。

本杰明·苏里耶(Benjamin Soulier)

可以使用ASP.NET Web API使用预建的或自定义的媒体格式化程序

在这种情况下,可以以上面链接中的自定义格式器为例,并根据需要修改JSON内容包装器(此处:using 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状态代码和内容协商的工作方式并可以对其进行自定义。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用Json.Net使用自定义键对字典进行序列化/反序列化?

来自分类Dev

如何使用C#序列化序列化为非常自定义的格式

来自分类Dev

在 JSON 序列化期间仅对部分数据进行自定义格式设置

来自分类Dev

jqGrid:在自定义格式化程序中使用预定义的格式化程序

来自分类Dev

在Django中自定义JSON序列化程序

来自分类Dev

自定义JSON序列化/反序列化,以多种可能的格式读取属性

来自分类Dev

JSON Jackson-使用自定义序列化程序序列化多态类时的异常

来自分类Dev

是否可以在自定义序列化程序中序列化为已知的默认格式?

来自分类Dev

在使用jqGrid进行排序功能之后应用自定义格式化程序

来自分类Dev

自定义反序列化,然后使用Jackson进行反序列化

来自分类Dev

如何自定义JSON对象序列化?

来自分类Dev

使用自定义序列化程序问题扩展RestSharp序列化

来自分类Dev

使用JaxRS自定义JSON序列化

来自分类Dev

使用Jackson自定义JSON反序列化

来自分类Dev

使用ServiceStack的自定义Json枚举序列化

来自分类Dev

如何使用自定义JMS序列化程序处理程序设置Nelmio Doc

来自分类Dev

JodaTime LocalDate / LocalTime无法使用自定义JSON序列化器类进行解析

来自分类Dev

使用System.Text.Json进行自定义反序列化

来自分类Dev

如何从两个序列化程序创建自定义输出 JSON

来自分类Dev

如何使用YamlDotNet序列化自定义类

来自分类Dev

如何使用 DataContractSerializer 自定义字典序列化?

来自分类Dev

使用Jackson自定义JSON序列化/反序列化

来自分类Dev

使用Jackson的自定义JSON序列化/反序列化

来自分类Dev

对Web API 2使用自定义JSON格式化程序

来自分类Dev

如何使用Java对自定义日期反序列化器进行单元测试

来自分类Dev

如何使用Java对自定义日期反序列化器进行单元测试

来自分类Dev

Django:如何在序列化程序的自定义方法中使用模型属性?

来自分类Dev

如何使用自定义boost :: log格式化程序输出TimeStamp和ThreadID属性?

来自分类Dev

使用JsonConverter的Json.NET自定义序列化-如何获得“默认”行为

Related 相关文章

  1. 1

    如何使用Json.Net使用自定义键对字典进行序列化/反序列化?

  2. 2

    如何使用C#序列化序列化为非常自定义的格式

  3. 3

    在 JSON 序列化期间仅对部分数据进行自定义格式设置

  4. 4

    jqGrid:在自定义格式化程序中使用预定义的格式化程序

  5. 5

    在Django中自定义JSON序列化程序

  6. 6

    自定义JSON序列化/反序列化,以多种可能的格式读取属性

  7. 7

    JSON Jackson-使用自定义序列化程序序列化多态类时的异常

  8. 8

    是否可以在自定义序列化程序中序列化为已知的默认格式?

  9. 9

    在使用jqGrid进行排序功能之后应用自定义格式化程序

  10. 10

    自定义反序列化,然后使用Jackson进行反序列化

  11. 11

    如何自定义JSON对象序列化?

  12. 12

    使用自定义序列化程序问题扩展RestSharp序列化

  13. 13

    使用JaxRS自定义JSON序列化

  14. 14

    使用Jackson自定义JSON反序列化

  15. 15

    使用ServiceStack的自定义Json枚举序列化

  16. 16

    如何使用自定义JMS序列化程序处理程序设置Nelmio Doc

  17. 17

    JodaTime LocalDate / LocalTime无法使用自定义JSON序列化器类进行解析

  18. 18

    使用System.Text.Json进行自定义反序列化

  19. 19

    如何从两个序列化程序创建自定义输出 JSON

  20. 20

    如何使用YamlDotNet序列化自定义类

  21. 21

    如何使用 DataContractSerializer 自定义字典序列化?

  22. 22

    使用Jackson自定义JSON序列化/反序列化

  23. 23

    使用Jackson的自定义JSON序列化/反序列化

  24. 24

    对Web API 2使用自定义JSON格式化程序

  25. 25

    如何使用Java对自定义日期反序列化器进行单元测试

  26. 26

    如何使用Java对自定义日期反序列化器进行单元测试

  27. 27

    Django:如何在序列化程序的自定义方法中使用模型属性?

  28. 28

    如何使用自定义boost :: log格式化程序输出TimeStamp和ThreadID属性?

  29. 29

    使用JsonConverter的Json.NET自定义序列化-如何获得“默认”行为

热门标签

归档