Требования для синтаксического анализатора JSON

Просто отфильтруйте его перед тем, как объединит массив в строку:

[" ", "9", "2", " ", "8", "3", " ", "A", "4", "\x82", "\x00"].
  take_while(&"\x80".method(:>))
#⇒ [" ", "9", "2", " ", "8", "3", " ", "A", "4"]

Затем выполните все, что вы хотите, с результирующим массивом.

5
задан pglowack 5 January 2009 в 13:48
поделиться

6 ответов

Я использовал инструментарий JSON в нескольких проектах с большим успехом. Единственной вещью, которую я изменил в какой-то момент, был способ, которым она форматирует получающийся JSON, но это - вопрос персонального вкуса.

Это свободно, довольно чисто, и просто в использовании. Никакая потребность установить пакеты; просто имейте .pas файл где-нибудь в Вашем пути. Просто проверьте test_usage.dpr ниже на некоторые простые примеры того, как использовать его. Это не становится намного легче, чем это.

Я не потратил бы впустую свое время, пытаясь реализовать еще один синтаксический анализатор JSON, если Вы не хотите сделать это в образовательных целях, в этом случае необходимо тщательно изучить существующие реализации так или иначе.

Инструментарий JSON домой: http://www.progdigy.com/?page_id=6

program test_usage;
{$IFDEF FPC}
  {$MODE OBJFPC}{$H+}
{$ELSE}
  {$APPTYPE CONSOLE}
{$ENDIF}

uses
  SysUtils,
  superobject;

var
  my_string, my_int, my_object, my_array: ISuperObject;
  new_obj: ISuperObject;
  j: integer;
  ite: TSuperObjectIter;

begin
  try
    my_string := TSuperObject.Create(#9);
    writeln('my_string=', my_string.AsString);
    writeln('my_string.AsJSon=', my_string.AsJSon);

    my_string := TSuperObject.Create('foo');
    writeln('my_string=', my_string.AsString);
    writeln('my_string.AsJson=', my_string.AsJson);

    my_int := TSuperObject.Create(9);
    writeln('my_int=', my_int.AsInteger);
    writeln('my_int.AsJson=', my_int.AsJson);

    my_array := TSuperObject.Create(stArray);
    my_array.I[''] := 1; // append
    my_array.I[''] := 2; // append
    my_array.I[''] := 3; // append
    my_array.I['4'] := 5;
    writeln('my_array=');
    with my_array.AsArray do
    for j := 0 to Length - 1 do
      if O[j] = nil then
        writeln(#9'[', j,']=', 'null') else
        writeln(#9'[', j,']=', O[j].AsJson);
    writeln('my_array.AsJson=', my_array.AsJson);

    my_object := TSuperObject.Create(stObject);
    my_object.I['abc'] := 12;
   // my_object.S['path.to.foo[5]'] := 'bar';
    my_object.B['bool0'] := false;
    my_object.B['bool1'] := true;
    my_object.S['baz'] := 'bang';
    my_object.S['baz'] := 'fark';
    my_object.AsObject.Delete('baz');
    my_object['arr'] := my_array;
    writeln('my_object=');
    if ObjectFindFirst(my_object, ite) then
    repeat
      writeln(#9,ite.key,': ', ite.val.AsJson);
    until not ObjectFindNext(ite);
    ObjectFindClose(ite);
    writeln('my_object.AsJson=', my_object.AsJson);

    new_obj := TSuperObject.Parse('"003"');
    writeln('new_obj.AsJson=', new_obj.AsJson);

    new_obj := TSuperObject.Parse('/* hello */"foo"');
    writeln('new_obj.AsJson=', new_obj.AsJson);

    new_obj := TSuperObject.Parse('// hello'#10'"foo"');
    writeln('new_obj.AsJson=', new_obj.AsJson);

    new_obj := TSuperObject.Parse('"\u0041\u0042\u0043"');
    writeln('new_obj.AsJson=', new_obj.AsJson);

    new_obj := TSuperObject.Parse('null');
    if new_obj = nil then
      writeln('new_obj.AsJson=', 'null');

    new_obj := TSuperObject.Parse('true');
    writeln('new_obj.AsJson=', new_obj.AsJson);

    new_obj := TSuperObject.Parse('12');
    writeln('new_obj.AsJson=', new_obj.AsJson);

    new_obj := TSuperObject.Parse('12.3');
    writeln('new_obj.AsJson=', new_obj.AsJson);

    new_obj := TSuperObject.Parse('["\n"]');
    writeln('new_obj.AsJson=', new_obj.AsJson);

    new_obj := TSuperObject.Parse('["\nabc\n"]');
    writeln('new_obj.AsJson=', new_obj.AsJson);

    new_obj := TSuperObject.Parse('[null]');
    writeln('new_obj.AsJson=', new_obj.AsJson);

    new_obj := TSuperObject.Parse('[]');
    writeln('new_obj.AsJson=', new_obj.AsJson);

    new_obj := TSuperObject.Parse('["abc",null,"def",12]');
    writeln('new_obj.AsJson=', new_obj.AsJson);

    new_obj := TSuperObject.Parse('{}');
    writeln('new_obj.AsJson=', new_obj.AsJson);

    new_obj := TSuperObject.Parse('{ "foo": "bar" }');
    writeln('new_obj.AsJson=', new_obj.AsJson);

    new_obj := TSuperObject.Parse('{ "foo": "bar", "baz": null, "bool0": true }');
    writeln('new_obj.AsJson=', new_obj.AsJson);

    new_obj := TSuperObject.Parse('{ "foo": [null, "foo"] }');
    writeln('new_obj.AsJson=', new_obj.AsJson);

    new_obj := TSuperObject.Parse('{ "abc": 12, "foo": "bar", "bool0": false, "bool1": true, "arr": [ 1, 2, 3, null, 5 ] }');
    writeln('new_obj.AsJson=', new_obj.AsJson);

    new_obj := TSuperObject.Parse('{ foo }');
    if (new_obj = nil) then
      writeln('got error as expected');

    my_string := nil;
    my_int := nil;
    my_object := nil;
    my_array := nil;
    new_obj := nil;


    writeln(#10'press enter ...');
    readln;
  except
    on E: Exception do
      writeln(E.Message)
  end;
end.
2
ответ дан 18 December 2019 в 13:20
поделиться

Я думаю, что Json.NET делает симпатичное, разбивают задание.

  • JsonReader и JsonWriter для низкоуровневой работы парсинга и вывода JSON
  • JsonSerializer для преобразования объектов к и от JSON
  • JObject, JArray и классы JValue для работы с JSON в объектной модели

Обратите внимание, что я могу быть небольшой предвзятостью, так как я записал это :)

4
ответ дан 18 December 2019 в 13:20
поделиться

Хороший пол был бы всей функциональностью, обеспеченной следующими 3 (взятый из JSON.org): uJson, Инструментарий JSON и lkjson.

3
ответ дан 18 December 2019 в 13:20
поделиться

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

Я настоятельно рекомендую парсинг стиля получения по запросу (у меня есть синтаксический анализатор XML, который является получением по запросу, также).

2
ответ дан 18 December 2019 в 13:20
поделиться

Я соглашаюсь с James; существует 3 разумных способа работать с Json: как поток событий/маркеров; как дерево (как XML DOM), или путем привязки с "собственными" объектами. Пакетом, с которым я знаком, является Jackson (http://jackson.codehaus.org), и он также поддерживает эти 3 метода, подобные тому, как (я принимаю), Json.NET делает.

1
ответ дан 18 December 2019 в 13:20
поделиться

Ну, хорошая вещь о JSON состоит в том, что он использует довольно простую грамматику и запись, что синтаксический анализатор для него довольно прост. при "упущении" всех относительно других реализаций, но использовании Delphi я запустил бы с класса TParser в единице классов для инициирования. Создайте отдельные методы обработать каждый элемент (некоторые уже сделаны в TParser, который является, почему я предложил запуститься оттуда).

Теперь, что сделать, с каким Вы проанализировали. Существует то, где забава входит. Если Вы подражаете интерфейсам и реализации TXmlDocument, то преобразование в XML/JSON несколько тривиально.

0
ответ дан 18 December 2019 в 13:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: