【问题标题】:Best way to deserialize a long string (response of an external web service)反序列化长字符串的最佳方法(响应外部 Web 服务)
【发布时间】:2009-10-26 18:16:26
【问题描述】:

我正在查询由其他开发人员构建的 Web 服务。它以类似 JSON 的格式返回结果集。我得到三列值(我已经知道每列的序数位置是什么意思):

[["Boston","142","JJK"],["Miami","111","QLA"],["Sacramento","042","PPT"]]

实际上,此结果集可能有数千条记录。

解析这个字符串的最佳方法是什么?

我想 JSON 反序列化器会很好,但在 C#/.NET 中使用什么是好的?我很确定 System.Runtime.Serialization.Json 序列化程序不起作用。

【问题讨论】:

    标签: c# json parsing serialization


    【解决方案1】:

    使用 asp.net 的内置库(System.Runtime.SerializationSystem.ServiceModel.Web),您可以轻松获得所需内容:

    string[][] parsed = null;
    var jsonStr = @"[[""Boston"",""142"",""JJK""],[""Miami"",""111"",""QLA""],[""Sacramento"",""042"",""PPT""]]";
    using (var ms = new System.IO.MemoryStream(System.Text.Encoding.Default.GetBytes(jsonStr)))
    {
        var serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof(string[][]));
        parsed = serializer.ReadObject(ms) as string[][];
    }
    

    一个更复杂的例子(这是我原来的答案) 首先制作一个用于序列化的虚拟类。它只需要一个成员来保存应该是 string[][] 类型的结果。

    [DataContract]
    public class Result
    {
        [DataMember(Name="d")]
        public string[][] d { get; set; }
    }
    

    然后就像将结果包装起来一样简单:{ "d": /<em>your results</em>/ }。请参阅下面的示例:

    Result parsed = null;
    var jsonStr = @"[[""Boston"",""142"",""JJK""],[""Miami"",""111"",""QLA""],[""Sacramento"",""042"",""PPT""]]";
    using (var ms = new MemoryStream(Encoding.Default.GetBytes(string.Format(@"{{ ""d"": {0} }}", jsonStr))))
    {
        var serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof(Result));
        parsed = serializer.ReadObject(ms) as Result;
    }
    

    【讨论】:

    • 谢谢,您的简单示例运行良好。我不需要复杂的东西 - 但很高兴知道。
    【解决方案2】:

    this怎么样?

    【讨论】:

    • 请不要裸链接。包括适用的标题和摘录。
    【解决方案3】:

    听起来您有一个非常简单的格式,您可以为其编写自定义解析器,因为您并不总是希望在它使用之前等待它解析并返回整个内容。

    我只需要编写一个递归解析器,它会查找标记“[”、“”、“\””和“]”并执行相应的操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-22
      • 1970-01-01
      相关资源
      最近更新 更多