asp.net webservices - 如何在与“d”相同的级别上返回参数

时间:2012-11-15 17:12:35

标签: c# asp.net json web-services

从.NET 3.5开始,返回json的Web服务将数据包装在名为“d”的参数中。我正在描述的功能已在其他地方记录here

我想知道是否有办法向json添加一个与“d”处于同一级别的参数。

所以借用上面的例子,如果我的一个Web服务的输出是

{"d":{"__type"    : "Person",
      "FirstName" : "Dave",
      "LastName"  : "Ward"}}

我希望它是什么

{"d":{"__type"    : "Person",
      "FirstName" : "Dave",
      "LastName"  : "Ward"},
 "z":{"__type"    : "AnotherType",
      "Property"  : "Value"}}

有没有办法实现这个目标?

2 个答案:

答案 0 :(得分:1)

虽然不建议这样做。 JSON结果被包装为安全功能。

然而,如果你绝对需要,这是一个解决方案:

在需要更改元素的[WebMethod]中添加

        Context.Response.ClearContent();
        Context.Response.Filter = new JsonHackFilter(Context.Response.Filter);

JsonHackFilter

的位置
class JsonHackFilter : MemoryStream
{
    private readonly Stream _outputStream = null;

    public JsonHackFilter(Stream output)
    {
        _outputStream = output;
    }

    public override void Write(byte[] buffer, int offset, int count)
    {

        string bufferContent = Encoding.UTF8.GetString(buffer);

        // TODO: Manually manipulate the string here

        _outputStream.Write(Encoding.UTF8.GetBytes(bufferContent), offset,
                           Encoding.UTF8.GetByteCount(bufferContent));

        base.Write(buffer, offset, count);
    }       

}

答案 1 :(得分:0)

我不相信有办法。 Web服务功能正在返回对象类型。即使你试图让它返回Object()也会做{“d”:[Object 1 ...,Object 2 ...]}

如果您确实需要特定的输出格式,您可以编写一个Generic Handler,并让ashx页面以您想要的特定格式返回json。