删除ASP.NET Restful WCF中的内部“__type”标记

时间:2011-09-30 20:39:14

标签: asp.net json rest serialization

我正在开发一个RESTful WCF,目前我无法获得漂亮,干净的JSON序列化返回值。

A little while back, I got rid of "Key" and "Value" tags围绕我的每个键和值(由序列化Dictionary<string, object>对象引起)使用包装器。

但是当我这样做时,“__type”标签开始出现。我设法通过在我的svc文件的ServiceHost标记中用WebServiceHostFactory替换WebScriptServiceHostFactory来删除“d”标记以及第一个“__type”标记。

所以我的结果如下:

{"Status":"Success","Data":{"__type":"SerializableDictionaryOfstringanyType:#MyNamespace.MyFolder","Key1":"Value1","Key2":"Value2","Key3":"Value3"}}

但我希望它看起来像这样:

{"Status":"Success","Data":{"Key1":"Value1","Key2":"Value2","Key3":"Value3"}}

我的测试网络服务代码如下所示:

[OperationContract]
[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.WrappedRequest, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
public SerializableDictionary<string, object> Test1(String Token, String Id)
{
    DataTable testTable = new DataTable();
    testTable.Columns.Add("Key1", typeof(System.String));
    testTable.Columns.Add("Key2", typeof(System.String));
    testTable.Columns.Add("Key3", typeof(System.String));

    DataRow testRow = testTable.NewRow();
    testRow["Key1"] = "Value1";
    testRow["Key2"] = "Value2";
    testRow["Key3"] = "Value3";

    testTable.Rows.Add(testRow);

    return SuccessfulResult(testTable);
}

编辑:并且SuccessfulResult函数看起来像这样(抱歉忘了它):

private SerializableDictionary<string, object> SuccessfulResult(DataTable dt = null)
{
    SerializableDictionary<string, object> result = new SerializableDictionary<string, object>();
    result.Add("Status", "Success");

    if (dt == null || dt.Rows.Count != 1)
        return result;

    SerializableDictionary<string, object> dct = new SerializableDictionary<string, object>();
    foreach (DataColumn currCol in dt.Rows[0].Table.Columns)
        dct.Add(currCol.ColumnName, dt.Rows[0][currCol.ColumnName].ToString());

    result.Add("Data", dct);

    return result;
}

如果有人对如何摆脱最后一点“__type”标签有任何想法,我很乐意听到它们!非常感谢,如果我发布了其他任何可能有用的内容,请告诉我。

3 个答案:

答案 0 :(得分:1)

好的,修好了 - 但最后做的事情有所不同。 WCF似乎坚持在序列化词典时放入那些内部的“__type”标签,但由于某种原因,它不会对Streams做同样的事情。

以下是新的网络服务方法代码(只是返回类型已更改):

[OperationContract]
[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.WrappedRequest, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
public Stream Test1(String Token, String StreamId)
{
    DataTable testTable = new DataTable();
    testTable.Columns.Add("Key1", typeof(System.String));
    testTable.Columns.Add("Key2", typeof(System.String));
    testTable.Columns.Add("Key3", typeof(System.String));

    DataRow testRow = testTable.NewRow();
    testRow["Key1"] = "Value1";
    testRow["Key2"] = "Value2";
    testRow["Key3"] = "Value3";

    testTable.Rows.Add(testRow);

    return SuccessfulResult(testTable);
}

这里是新的SuccessfulResult函数(这就是它的不同之处):

private Stream SuccessfulResult(DataTable dt = null)
{
    Dictionary<string, object> returnDict = new Dictionary<string, object>();
    returnDict.Add("Status", "Success");

    Dictionary<string,object> dct = new Dictionary<string,object>();
    foreach (DataColumn currCol in dt.Rows[0].Table.Columns)
        dct.Add(currCol.ColumnName, dt.Rows[0][currCol.ColumnName].ToString());

    returnDict.Add("Data", dct);

    string sResponse = json.Serialize(returnDict);
    byte[] byResponse = Encoding.UTF8.GetBytes(sResponse);

    return new MemoryStream(byResponse);
}

现在输出看起来就像我想要的那样:

{"Status":"Success","Data":{"Key1":"Value1","Key2":"Value2","Key3":"Value3"}}

无论如何,我希望这个例子可以帮助其他人:)

答案 1 :(得分:0)

在某些情况下,浏览器会将响应流视为二进制文件,因此,它会显示下载文件弹出窗口。 然后你应该使用:

string result = "Hello world";
byte[] resultBytes = Encoding.UTF8.GetBytes(result);
WebOperationContext.Current.OutgoingResponse.ContentType = "text/plain";
return new MemoryStream(resultBytes);

答案 2 :(得分:-1)

我知道这是很久以前的事了,但我找到了一种非常简单的方法来实现这一目标。

在Web.Config文件中,您应该更改一行。

使用<webHttp/>代替<enableWebScript/>

  <endpointBehaviors>
        <behavior>
          <webHttp />
        </behavior>