您的代码中至少有两个问题。第一个:您进行两次JSON 序列化。第二:您不能将 JSON 字符串附加到其他数据,因为在结果字符串中将不再是 JSON 格式。
如果您[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
为 web 方法使用属性,您返回的对象将自动序列化为 JSON 字符串。所以你不应该在之前手动序列化它。
如果您想要序列化的对象已经是一个字符串,那么在序列化过程中,所有引号都将被转义("
将被替换为\"
)。在您手动对象序列化后的情况下,您收到的字符串[{"__type":"User:#HagarDB", "ID":1}]
是正确的 JSON 字符串。要验证这一点,您可以将字符串粘贴到验证器http://www.jsonlint.com/中。有关 JSON 格式的更多信息,您可以在http://www.json.org/上阅读。
如果您将数据附加到另一个字符串"SecurityGroup": 1
(不是 JSON 字符串,正确的是{"SecurityGroup": 1}
),在字符串之间使用逗号,您将收到该字符串
[{"__type":"User:#HagarDB", "ID":1}], "SecurityGroup": 1
这也是错误的 JSON。正确的 JSON 将类似于
{ "MyArray": [ {"__type": "User:#HagarDB", "ID": 1 } ], "SecurityGroup": 1 }
最后,您返回字符串作为网络方法的结果,并以{d: result}
所有配额都将被转义的形式接收结果:
{
"d": "[{\"__type\":\"User:#HagarDB\", \"ID\":1}], \"SecurityGroup\": 1"
}
这是一个 JSON 字符串,但它不是您想要的。
您的问题的解决方案非常简单。您的网络方法可能如下所示
[WebMethod, ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public MyResult MyMethod () {
List<Users> users = BuildMyInnerInformation();
return new MyResult { Users: users, SecurityGroup: 1};
}
public class MyResult {
public List<Users> Users { get; set; }
public int SecurityGroup { get; set; }
}