(* Collection of code snippets by Arne Vajhøj *)
(* (from articles on eksperten.dk / vajhoej.dk written sometime between 2004 and now) *)
[inherit('common','pJSON')]
program readjson(input, output);

%include 'data.inc'

const
   MAX_ORDER = 1000;

type
   order_array =  array [1..MAX_ORDER] of order;

procedure load(fnm : pstr; var o : order_array; var n : integer);

var
   f : text;
   json, line : pstr;
   orders, oneorder, orderlines, oneorderline: cJSON_ptr;
   i, j : integer;

begin
   open(f, fnm, old);
   reset(f);
   json := '';
   while not(eof(f)) do begin
      readln(f, line);
      json := json + line;
   end;
   close(f);
   orders := pJSON_Parse(json);
   n := pJSON_GetArraySize(orders);
   for i := 1 to n do begin
      oneorder := pJSON_GetArrayItem(orders, i - 1);
      o[i].id := pJSON_IntValue(pJSON_GetObjectItem(oneorder, 'id'));
      o[i].customer := pJSON_StringValue(pJSON_GetObjectItem(oneorder, 'customer'));
      o[i].status := pJSON_StringValue(pJSON_GetObjectItem(oneorder, 'status'));
      orderlines := pJSON_GetObjectItem(oneorder, 'orderlines');
      o[i].nlines := pJSON_GetArraySize(orderlines);
      for j := 1 to o[i].nlines do begin
         oneorderline := pJSON_GetArrayItem(orderlines, j - 1);
         o[i].line[j].item := pJSON_StringValue(pJSON_GetObjectItem(oneorderline, 'item'));
         o[i].line[j].qty := pJSON_IntValue(pJSON_GetObjectItem(oneorderline, 'qty'));
         o[i].line[j].price := round(pJSON_DoubleValue(pJSON_GetObjectItem(oneorderline, 'price')) * 100.0);
      end;
   end;
   pJSON_Delete(orders);
end;

procedure dump(o : order_array; n : integer);

var
   i, j : integer;

begin
   for i := 1 to n do begin
      write('id=', o[i].id:1);
      write(' customer=', o[i].customer);
      writeln(' status=', o[i].status);
      for j := 1 to o[i].nlines do begin
         write('  item=', o[i].line[j].item);
         write(' qty=', o[i].line[j].qty:1);
         writeln(' price=', (o[i].line[j].price / 100.00):4:2);
      end;
   end;
end;

var
   o : order_array;
   n : integer;

begin
   load('diy.json', o, n);
   dump(o, n);
   load('lib.json', o, n);
   dump(o, n);
end.
