我正在开发一个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”标签有任何想法,我很乐意听到它们!非常感谢,如果我发布了其他任何可能有用的内容,请告诉我。
答案 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>