我正在使用DataContractJsonSerializer将对象序列化为json,然后使用AJAX返回客户端。我现在需要序列化另一个对象以与它一起返回。问题是包含JSON的MS“d”,这使我无法简单地将字符串连接成单个JSON字符串。
json = json & """,""SecurityGroups"": 1"
返回:
{
"d":"[{
\"__type\":\"User:#HagarDB\",
\"ID\":1
}]\",
\"SecurityGroup\": 1"
}
任何建议都将不胜感激。我宁愿不必另外调用服务器来获取另一个对象。
答案 0 :(得分:0)
正如RPM1984在评论中建议的那样,最好的解决方案可能是创建一个包含要序列化的对象的类。
如果出于某种原因这不是一个选项,那么你可以做一些简单的字符串操作来插入新对象:
// Find position of the ending characters }]
var endPosition = json.IndexOf("}]");
// Insert the new json between the } and the ]
var newJson = json.Substring(0, endPosition +1) + newJson + json.Substring(endPosition);
也许你需要在新的json之前添加一个逗号,也许你需要调整字符串索引,但是你明白了。由于json是一种简单的字符串格式,因此您也可以将其视为字符串。
这最后的结论非常难看,但它应该作为一次性解决方案。
答案 1 :(得分:0)
您的代码中至少有两个问题。第一个:你使JSON序列化两次。第二种:你不能用另一个数据附加JSON字符串,因为在结果字符串中不会有更多的JSON格式。
如果您对Web方法使用[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
属性,则您提交的对象将自动序列化为JSON字符串。所以你应该不之前手动序列化它。
如果您要序列化的对象已经是一个字符串,那么在序列化期间,所有的quoate都将被确定("
将被替换为\"
)。在您的情况下,在手动对象序列化后,您收到了字符串[{"__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 }
最后,您返回字符串作为web methid的结果,并以{d: result}
格式接收结果,其中所有配额都将被转义:
{
"d": "[{\"__type\":\"User:#HagarDB\", \"ID\":1}], \"SecurityGroup\": 1"
}
这是一个JSON字符串,但它不是你想要的。
您的问题的解决方案非常简单。您的Web方法可能如下所示
[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; }
}