2013-02-20 2 views
1

Мне нужно десериализовать из JSON StreamReader без создания промежуточных объектов для каждого объекта в этом потоке.Есть ли для JSON StreamReader синтаксический анализатор для .NET?

  • JSON.NET вызывается как JsonConvert.DeserializeObject<T>(string json, JsonConverter[] converters)
    1. не принимает StreamReader и
    2. создает в памяти весь набор Newtonsoft.Json.* классов для structore JSON, а профилировщика памяти шоу. _I'm фактически не уверен, что это так, потому что мои JsonConverter s _
  • JavaScriptSerializer также, кажется, не поддерживает Stream с на всех.
    1. И даже undocummented new JsonSerializer().Deserialize(new JsonTextReader(streamReader))

То, что я хочу в нулевом подходе является SAX или StAX -стиль JSON парсер.

То, что я хочу, в идеале, это API, как

object JsonCooler.DeserializeObject<T>(
    StreamReader jsonStream, Converter[] converters) 

который будет десериализации непосредственно в новый экземпляр класса T, не сохраняя все свои промежуточные DOM-подобные объекты в памяти.

Существует ли такой десериализатор? Или что мне не хватает на уровне концепции?

+0

В конце концов я в первую очередь осуществил его; для примера использования см.: [https://github.com/ysharplanguage/FastJsonParser/blob/master/JsonTest/ParserTests.cs#L675](https://github.com/ysharplanguage/FastJsonParser/blob/ master/JsonTest/ParserTests.cs # L675) – YSharp

+0

Также см. другой ответ и образец, которые я дал связанному вопросу: http://stackoverflow.com/a/23731522/1409653 – YSharp

ответ

1

Я подозреваю, что это прецедент становится все более частым. Я рассматриваю, чтобы поддержать его какое-то время с помощью этого маленького, который я также стремиться держать короткие и быстро:

https://github.com/ysharplanguage/FastJsonParser

Я все еще занят, что делает его стабильным первым, но если вы хотите, чтобы дать попробовать на реализуя это на развилке до того, как я получу шанс, этого было бы достаточно, чтобы немного поменять методы Obj (int external) и Arr (int external) вместе с добавлением (необязательного) делегата callback «reviver» в кэш TypeInfo , Это позволило бы приложению решить, будет ли/когда следующий объект «{...}» или array [...] »в потоке нуждается в полном десериализации его содержимого или нет.

HTH,

0

Я нашел DataReader в LitJSON, но он довольно устарел. Примите любой лучший ответ.