Лучший способ десериализации длинной строки (ответ внешнего веб-сервиса) - PullRequest
0 голосов
/ 26 октября 2009

Я запрашиваю веб-сервис, созданный другим разработчиком. Возвращает набор результатов в формате JSON. Я получаю три значения столбца (я уже знаю, что означает порядковый номер каждого столбца):

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

На самом деле этот набор результатов может содержать тысячи записей.

Какой самый лучший способ разобрать эту строку?

Полагаю, десериализатор JSON был бы неплох, но что лучше использовать в C # / .NET? Я уверен, что сериализатор System.Runtime.Serialization.Json не будет работать.

Ответы [ 3 ]

1 голос
/ 26 октября 2009

Используя встроенные библиотеки для asp.net (System.Runtime.Serialization и System.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;
}
1 голос
/ 26 октября 2009

Как насчет этого ?

0 голосов
/ 26 октября 2009

Похоже, у вас есть довольно простой формат, для которого вы могли бы написать собственный анализатор, поскольку вы не всегда хотите ждать, пока он проанализирует и вернет весь объект, прежде чем он его использует.

Я бы просто написал рекурсивный парсер, который ищет токены "[", ",", "\" "и"] "и выполняет соответствующие действия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...