Как разобрать JSON с веб-сайта https с помощью Ada - PullRequest
1 голос
/ 03 апреля 2020

Я пытаюсь сделать простой синтаксический анализатор для веб-сайта https pu sh, поэтому пытаюсь следовать примеру из http://rosettacode.org/wiki/HTTP#Ada, просто меняя адрес с веб-сайта.

Итак, я попытался

    with Ada.Text_IO; use Ada.Text_IO;
    with AWS.Client;
    with AWS.Response;
    procedure Main_Other is
    begin
       Put_Line (AWS.Response.Message_Body
                 (AWS.Client.Get
                    (URL => "https://google.com")));
    end Main_Other;

Но я получил исключение

поднял PROGRAM_ERROR: aws -client.adb: 398 завершить / настроить возникшее исключение [2020-04- 02 10:41:20] процесс завершился со статусом 1, прошедшее время: 00.80s

Итак, есть мысли о том, как это исправить?

Я бы хотел разобрать текущее состояние некоторых таблиц на веб-сайте, подобное тому, что было сделано в Python

    import pandas as pd
    def retrieve_json(json_url):
        return pd.read_json(json_url)

Я хотел бы закодировать это решение самым простым способом, даже лучше не полагаться на AWS.

Пожалуйста, и спасибо.

1 Ответ

5 голосов
/ 04 апреля 2020

Похоже, вы используете сборку AWS с отключенной поддержкой SSL (поддержка SSL не является обязательной). Замена https на http должна помочь. Если незащищенное соединение недоступно, либо перекомпилируйте AWS с включенной поддержкой SSL (см. здесь и здесь ), либо, если вы спешите и собираетесь продолжить Linux, откат на GNAT.Expect и wget (протестировано с GNAT CE 2019):

main.adb

with Ada.Text_IO;   use Ada.Text_IO;
with GNAT.Expect;   use GNAT.Expect; 
with GNATCOLL.JSON; use GNATCOLL.JSON;

procedure Main is

   -------------------
   -- Download_JSON --
   -------------------

   function Download_JSON (URL : String) return JSON_Value is      

      Cmd    : constant String := "wget";
      Arg_1  : aliased String := "-q";   --  Turn off Wget's own messages.
      Arg_2  : aliased String := "-O";   --  Output response to ...
      Arg_3  : aliased String := "-";    --     ... standard output.
      Arg_4  : aliased String := URL;
      Status : aliased Integer;

      Response : String :=
        Get_Command_Output
          (Command    => Cmd,
           Arguments  => (1 => Arg_1'Unchecked_Access,
                          2 => Arg_2'Unchecked_Access,
                          3 => Arg_3'Unchecked_Access,
                          4 => Arg_4'Unchecked_Access),
           Input      => "",
           Status     => Status'Unchecked_Access);

   begin
      --  Omitting check of 'Status' for brevity.
      return Read (Response); 
   end;


   Root : JSON_Value;

begin

   Root := Download_JSON
     ("https://raw.githubusercontent.com/AdaCore/gnatcoll-core/" &
        "master/testsuite/tests/json/validation/basic_object.json");

   Put_Line (Write (Root));

end Main;

по умолчанию .gpr

with "gnatcoll.gpr";

project Default is
    for Source_Dirs use ("src");
    for Object_Dir use "obj";
    for Main use ("main.adb");
end Default;

вывод

$ ./main
{"a":1,"b":"a tringg","c":[1,2,3],"d":{"a":"a"},"e":null}
...