【问题标题】:.NET Append JSON to a string already serialized with DataContractJsonSerializer.NET 将 JSON 附加到已使用 DataContractJsonSerializer 序列化的字符串
【发布时间】:2010-09-06 06:34:55
【问题描述】:

我正在使用 DataContractJsonSerializer 将对象序列化为 json,然后使用 AJAX 返回客户端。我现在需要序列化另一个对象以与它一起返回。问题是围绕 JSON 的 MS“d”,这阻止了我简单地将字符串连接成单个 JSON 字符串。

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

返回:

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

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

【问题讨论】:

  • 为什么不创建一个特殊的“viewmodel”类型的对象来容纳这两个对象呢?然后你可以序列化到这个。基本上是嵌套的数据合约。

标签: .net json append datacontractjsonserializer


【解决方案1】:

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

如果你为web方法使用[ScriptMethod(ResponseFormat = ResponseFormat.Json)]属性,你返回的对象将自动序列化为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 }

最后,您将返回字符串作为 web methid 的结果,并以 {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; }
}

【讨论】:

    【解决方案2】:

    正如 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 是一种简单的字符串格式,所以你也可以把它当作字符串来处理。

    最后一个建议非常难看,但它应该作为一次性解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-06
      • 1970-01-01
      • 1970-01-01
      • 2013-12-31
      • 2020-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多