我有一个必须返回JSON的wcf服务。我的代码如下:
public String areaGetStreetTypes(int city_id, int language_id)
{
string json = "";
string responseList = "{\"triname\":\"IMP\",\"name\":\"IMPASSE\"}";
if (responseList.Length != 0){
string responseStatusJSON = "{\"status\":0, \"message\":\"Success !!!\"}";
json += "{\"responseList\":[" + responseList + "],";
json += "\"responseStatus\":" + responseStatusJSON + "}";
}
else{
string responseStatusJSON = "{\"status\":1, \"message\":\"Error !!!\"}";
json += responseStatusJSON;
}
return json;
}
//my interface looks like
[OperationContract]
[WebInvoke(Method = "POST", UriTemplate = "areaGetStreetTypes", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped)]
String areaGetStreetTypes(int city_id, int language_id);
原始格式的回复:
{ “areaGetStreetTypesResult”: “{\” responseList \ “:[{\” triname \ “:\” IMP \” \ “名称\”:\ “IMPASSE \”}],\ “responseStatus \”: {\“status \”:0,\“message \”:\“成功!!! \”}}“}
我使用php脚本进行测试。首次解码后:
stdClass对象(
[areaGetStreetTypesResult] => {"responseList":[{"triname":"IMP","name":"IMPASSE"}],"responseStatus":{"status":0, "message":"Success !!!"}}
)
只有在我的第二个json_decode之后,我得到了我想要的东西:GOOD JSON Response
我可以在服务中更改什么才能第一次获得好的JSON?我想只解码一次。
答案 0 :(得分:2)
你JSON'ing两次 - 一次在你的方法中,第二次告诉WCF在WebInvoke属性中使用JSON序列化。
为什么不多做几个合同并返回它们,而不是手动构造结果字符串?
答案 1 :(得分:1)
您可以创建一个可以返回的类对象,如下所示:
namespace Rest
{
public class JsonRes
{
public ResponseList ResponseList { get; set; }
public ResStatus ResponseStatus { get; set; }
}
public class ResponseList
{
public string triName { get; set; }
public string name { get; set; }
}
public class ResStatus
{
public string status { get; set; }
public string message { get; set; }
}
}
WCF框架对JSON进行序列化。
如果您正在从db动态构建json String,那么尝试查找是否可以获得在所有情况下都足够的通用对象。就像拥有一个具有列名及其值的对象列表,然后将完整列表传回给客户端。