【问题标题】:How to prevent a WebMethod from serializing a json response如何防止 WebMethod 序列化 json 响应
【发布时间】:2017-02-09 08:18:21
【问题描述】:

我有一个返回数据的网络方法。 我有将我的对象序列化为 json 的特定代码,以便忽略空值和其他用途。

发生的情况是 .Net 再次序列化响应:

对象 = {a:2}

第一个序列化 = {"a": "2"}

第二次序列化 = "{\"a\": \"2\"}"

如何防止 .Net 第二次序列化我的响应。

代码:

[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public static object XXX()
{
   return new { a = 2 }.ToJson();
}

【问题讨论】:

  • 如果你只返回return new { a = 2 };你会得到什么?

标签: c# json serialization webmethod


【解决方案1】:

.ToJson() 调用是不必要的 - 删除它:

[WebMethod]
public static object XXX()
{
   return new { a = 2 };
}

原因是 Web API serializes to JSON by default:

什么会被序列化?

默认情况下,所有公共属性和字段都包含在序列化的 JSON 中。要省略属性或字段,请使用 JsonIgnore 属性对其进行修饰。

因此,除非明确忽略,或客户端调用特定的媒体格式化程序(通过Content-Type 请求标头),否则您的返回类型将序列化为 JSON。由于额外的.ToJson() 调用而发生了双重序列化。

您的ScriptMethod 属性也是不必要的,因为JSON 是ScriptMethodAttribute.ResponseFormat property 的默认值。

【讨论】:

  • 正如我所说,我有特定的序列化代码。我想自己序列化。
【解决方案2】:

您可以通过在禁用 XML 序列化的同时将序列化方法设置为 XML 来完成此操作。这将允许您返回一个简单的字符串,其中包含您自己序列化的 JSON。

    [ScriptMethod(ResponseFormat = ResponseFormat.Xml, UseHttpGet = false, XmlSerializeString = false)]
    public static string XXX() {
        return new { a = 2 }.ToJson();
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    • 2015-08-29
    • 2014-02-13
    • 1970-01-01
    • 1970-01-01
    • 2018-03-01
    相关资源
    最近更新 更多