反序列化长字符串的最佳方法(外部Web服务的响应)

时间:2009-10-26 18:16:27

标签: c# json parsing serialization

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

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

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

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

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

3 个答案:

答案 0 :(得分:1)

this怎么样?

答案 1 :(得分: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": /your results/ }。请参阅下面的示例:

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 :(得分:0)

听起来你有一个非常简单的格式,你可以编写一个自定义解析器,因为你并不总是想等它解析并在它使用之前返回整个东西。

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