.NET将JSON附加到已使用DataContractJsonSerializer序列化的字符串

.NET将JSON附加到已使用DataContractJsonSerializer序列化的字符串,.net,json,append,datacontractjsonserializer,.net,Json,Append,Datacontractjsonserializer,我使用DataContractJsonSerializer将对象序列化为json,然后使用AJAX返回到客户机。我现在需要序列化另一个对象以随它一起返回。问题是围绕JSON的MSs d,它阻止我将字符串简单地连接到单个JSON字符串中 json = json & """,""SecurityGroups"": 1" 返回: { "d":"[{ \"__type\":\"User:#HagarDB\", \"ID\":1 }]\",

我使用DataContractJsonSerializer将对象序列化为json,然后使用AJAX返回到客户机。我现在需要序列化另一个对象以随它一起返回。问题是围绕JSON的MSs d,它阻止我将字符串简单地连接到单个JSON字符串中

json = json & """,""SecurityGroups"": 1"
返回:

{
    "d":"[{
        \"__type\":\"User:#HagarDB\",
        \"ID\":1
    }]\",
    \"SecurityGroup\": 1"
}

如有任何建议,将不胜感激。我宁愿不必再次调用服务器来获取另一个对象。

正如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是一种简单的字符串格式,因此也可以将其视为字符串


最后一个建议很难看,但它应该是一次性的解决方案。

您的代码中至少有两个问题。第一个:进行两次JSON序列化。第二:不能将JSON字符串附加到另一个数据中,因为结果字符串中的JSON格式不会更多

如果对web方法使用[ScriptMethodResponseFormat=ResponseFormat.Json]属性,则返回的对象将自动序列化为Json字符串。因此,您不应该在之前手动序列化它

如果要序列化的对象已经是字符串,则在序列化过程中,所有quoates将被替换为\。在手动对象序列化之后,您收到了字符串[{uuuu type:User:HagarDB,ID:1}],这是正确的JSON字符串。要验证这一点,您只需将字符串粘贴到验证器中。更多关于JSON格式的信息,请阅读

如果您使用另一个字符串(如SecurityGroup:1,它不是JSON字符串)附加数据,则正确的字符串将是{SecurityGroup:1},在您将接收到的字符串之间带有逗号

[{"__type":"User:#HagarDB", "ID":1}], "SecurityGroup": 1
这也是错误的。正确的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; }
}

为什么不创建一个包含两个对象的特殊viewmodel类型对象?然后你可以序列化到这个。基本上是嵌套的数据契约。