Jeff Meatball Yang
Jeff Meatball Yang

Reputation: 39047

Best way to deserialize a long string (response of an external web service)

I am querying a web service that was built by another developer. It returns a result set in a JSON-like format. I get three column values (I already know what the ordinal position of each column means):

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

In reality, this result set can be thousands of records long.

What's the best way to parse this string?

I guess a JSON deserializer would be nice, but what is a good one to use in C#/.NET? I'm pretty sure the System.Runtime.Serialization.Json serializer won't work.

Upvotes: 0

Views: 496

Answers (3)

Joshua Shannon
Joshua Shannon

Reputation: 2731

Using the built in libraries for asp.net (System.Runtime.Serialization and System.ServiceModel.Web) you can get what you want pretty easily:

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[][];
}

A little more complex example (which was my original answer) First make a dummy class to use for serialization. It just needs one member to hold the result which should be of type string[][].

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

Then it's as simple as wrapping your result up like so: { "d": /your results/ }. See below for an example:

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;
}

Upvotes: 1

Eric Normand
Eric Normand

Reputation: 3836

It sounds like you have a pretty simple format that you could write a custom parser for, since you don't always want to wait for it to parse and return the entire thing before it uses it.

I would just write a recursive parser that looks for the tokens "[", ",", "\"", and "]" and does the appropriate thing.

Upvotes: 0

Jonathan Feinberg
Jonathan Feinberg

Reputation: 45334

How about this?

Upvotes: 1

Related Questions