Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Leer archivo JSON (https://www.clubdelphi.com/foros/showthread.php?t=94889)

oscarac 24-09-2020 01:07:27

Leer archivo JSON
 
buenas tardes

tengo algunos problemas para implementar esto

he leido algunas rutinas para leer la cadena JSON, pero lo que no encuentro es ver la forma de abrir un archivo con informacion en formato JSON y parsearla

alguien me ayuda con esto?

basicamente es un archivo de texto (JSON) quiero parsearlo

oscarac 24-09-2020 03:22:12

ya pude hacerlo, abrir el archivo y lo puse en un Memo y de ahi lo parseo
pero tengo un problema con la estructura del JSON

al parecer hay 2 niveles

plain_orders_USER_mobile_number_13 -> identifica a la persona
products -> empieza el bloque de la informacion que necesito

la idea es que la persona, tiene un listado de productos para una fecha determinada

tengo este codigo

Código Delphi [-]
procedure TForm1.Button2Click(Sender: TObject);
var
  JSo :  TJSONObject;
  JSOarray : TJSONArray;
  JSOValue: TJSONValue;
  remitente, destinatario, mensaje, estado : string;
begin
      JSOarray := TJSONObject.ParseJSONValue(Memo1.Text) as TJSONArray;
      for JSOValue in JSOarray do
      begin
        JSo := TJSONObject.ParseJSONValue(JSOValue.ToJSON) as TJSONObject;
        remitente :=  JSo.Values['category'].ToString;
        destinatario :=  JSo.Values['name'].ToString;
        Memo2.Lines.Add( remitente + '   ' + destinatario );  esto es para efectos de mostrar la informacion
      end;
end;


pero no me esta jalando la informacion porque al parecer no le estoy diciendo de donde sacarlo (Cliente), no se si alguien me puede entender
Cita:

[{
"plain_orders_USER_mobile_number_13": "3242342342342",
"products": [{
"category": "1",
"name": "Pollo broaster con ensalada de chucrut y arroz",
"Event-Time": "01\/10\/2020 (Hora De Almuerzo)"
}, {
"category": "2",
"name": "patita con mani",
"Event-Time": "02\/10\/2020 (Hora De Almuerzo)"
}, {
"category": "1",
"name": "Lentejas",
"Event-Time": "05\/10\/2020 (Hora De Almuerzo)"
}, {
"category": "1",
"name": "Pollo a la olla con garbanzos y arroz",
"Event-Time": "06\/10\/2020 (Hora De Almuerzo)"
}, {
"category": "2",
"name": "Tallarines Rojos",
"Event-Time": "07\/10\/2020 (Hora De Almuerzo)"
}, {
"category": "2",
"name": "Hamburguesa de carne con quinua guisada y arroz",
"Event-Time": "08\/10\/2020 (Hora De Almuerzo)"
}, {
"category": "1",
"name": "Milanesa de pescado con arvejita y arroz",
"Event-Time": "09\/10\/2020 (Hora De Almuerzo)"
}, {
"category": "2",
"name": "Saltado de vainitas de pollo con papas fritas y arroz",
"Event-Time": "12\/10\/2020 (Hora De Almuerzo)"
}, {
"category": "1",
"name": "Cerdo a la bbq con pur\u00e9 de papa y arroz",
"Event-Time": "13\/10\/2020 (Hora De Almuerzo)"
}, {
"category": "2",
"name": "Tallar\u00edn saltado de res",
"Event-Time": "14\/10\/2020 (Hora De Almuerzo)"
}, {
"category": "1",
"name": "Pechuguita de pollo al horno con lentejitas y arroz",
"Event-Time": "15\/10\/2020 (Hora De Almuerzo)"
}, {
"category": "2",
"name": "Pollo al sillao con papa sancochada y arroz",
"Event-Time": "16\/10\/2020 (Hora De Almuerzo)"
}, {
"category": "1",
"name": "Nuggets de pescado con locro de zapallo y arroz",
"Event-Time": "19\/10\/2020 (Hora De Almuerzo)"
}, {
"category": "2",
"name": "Pavita al horno con ajiaco de papa",
"Event-Time": "20\/10\/2020 (Hora De Almuerzo)"
}, {
"category": "1",
"name": "Tallarines a la bolognesa",
"Event-Time": "21\/10\/2020 (Hora De Almuerzo)"
}]
}, {
"plain_orders_USER_mobile_number_13": "",
"products": [{
"category": "1",
"name": "Pollo broaster con ensalada de chucrut y arroz",
"Event-Time": "01\/10\/2020 (Hora De Almuerzo)"
}, {
"category": "2",
"name": "patita con mani",
"Event-Time": "02\/10\/2020 (Hora De Almuerzo)"
}, {
"category": "1",
"name": "Lentejas",
"Event-Time": "05\/10\/2020 (Hora De Almuerzo)"
}, {
"category": "1",
"name": "Pollo a la olla con garbanzos y arroz",
"Event-Time": "06\/10\/2020 (Hora De Almuerzo)"
}, {
"category": "2",
"name": "Tallarines Rojos",
"Event-Time": "07\/10\/2020 (Hora De Almuerzo)"
}, {
"category": "2",
"name": "Hamburguesa de carne con quinua guisada y arroz",
"Event-Time": "08\/10\/2020 (Hora De Almuerzo)"
}, {
"category": "1",
"name": "Milanesa de pescado con arvejita y arroz",
"Event-Time": "09\/10\/2020 (Hora De Almuerzo)"
}, {
"category": "2",
"name": "Saltado de vainitas de pollo con papas fritas y arroz",
"Event-Time": "12\/10\/2020 (Hora De Almuerzo)"
}, {
"category": "1",
"name": "Cerdo a la bbq con pur\u00e9 de papa y arroz",
"Event-Time": "13\/10\/2020 (Hora De Almuerzo)"
}, {
"category": "2",
"name": "Tallar\u00edn saltado de res",
"Event-Time": "14\/10\/2020 (Hora De Almuerzo)"
}]
}, {
"plain_orders_USER_mobile_number_13": "",
"products": [{
"category": "1",
"name": "Pollo broaster con ensalada de chucrut y arroz",
"Event-Time": "01\/10\/2020 (Hora De Almuerzo)"
}]
}, {
"plain_orders_USER_mobile_number_13": "",
"products": [{
"category": "1",
"name": "Ticket: Pollo broaster con ensalada de chucrut y arroz 2020\/10\/01 - 2020\/10\/01",
"Event-Time": "01\/10\/2020 (Hora De Almuerzo)"
}]
}, {
"plain_orders_USER_mobile_number_13": "",
"products": [{
"category": "2",
"name": "Ticket: Hamburguesa de carne con quinua guisada y arroz 2020\/10\/08 - 2020\/10\/08",
"Event-Time": "08\/10\/2020 (Hora De Almuerzo)"
}, {
"category": "1",
"name": "Ticket: Pollo broaster con ensalada de chucrut y arroz 2020\/10\/01 - 2020\/10\/01",
"Event-Time": "01\/10\/2020 (Hora De Almuerzo)"
}, {
"category": "2",
"name": "Ticket: Pollo broaster con ensalada de chucrut y arroz 2020\/10\/02 - 2020\/10\/02",
"Event-Time": "02\/10\/2020 (Hora De Almuerzo)"
}, {
"category": "1",
"name": "Ticket: Lentejas 2020\/10\/05 - 2020\/10\/05",
"Event-Time": "05\/10\/2020 (Hora De Almuerzo)"
}, {
"category": "1",
"name": "Ticket: Pollo a la olla con garbanzos y arroz 2020\/10\/06 - 2020\/10\/06",
"Event-Time": "06\/10\/2020 (Hora De Almuerzo)"
}, {
"category": "2",
"name": "Ticket: Tallarines Rojos 2020\/10\/07 - 2020\/10\/07",
"Event-Time": "07\/10\/2020 (Hora De Almuerzo)"
}, {
"category": "1",
"name": "Ticket: Milanesa de pescado con arvejita y arroz 2020\/10\/09 - 2020\/10\/09",
"Event-Time": "09\/10\/2020 (Hora De Almuerzo)"
}, {
"category": "2",
"name": "Ticket: Saltado de vainitas de pollo con papas fritas y arroz 2020\/10\/12 - 2020\/10\/12",
"Event-Time": "12\/10\/2020 (Hora De Almuerzo)"
}, {
"category": "1",
"name": "Ticket: Cerdo a la bbq con pur\u00e9 de papa y arroz 2020\/10\/13 - 2020\/10\/13",
"Event-Time": "13\/10\/2020 (Hora De Almuerzo)"
}, {
"category": "2",
"name": "Ticket: Tallar\u00edn saltado de res 2020\/10\/14 - 2020\/10\/14",
"Event-Time": "14\/10\/2020 (Hora De Almuerzo)"
}, {
"category": "1",
"name": "Ticket: Pechuguita de pollo al horno con lentejitas y arroz 2020\/10\/15 - 2020\/10\/15",
"Event-Time": "15\/10\/2020 (Hora De Almuerzo)"
}]
}]

oscarac 24-09-2020 04:59:17

buenas tardes

como podria parsear un json con esta estructura

Cita:

[{
"plain_orders_USER_mobile_number_13": "3242342342342",
"products": [{
"category": "1",
"name": "Pollo broaster con ensalada de chucrut y arroz",
"Event-Time": "01\/10\/2020 (Hora De Almuerzo)"},
{
"category": "2",
"name": "patita con mani",
"Event-Time": "02\/10\/2020 (Hora De Almuerzo)"}]
}, {
"plain_orders_USER_mobile_number_13": "1234",
"products": [{
"category": "1",
"name": "Pollo broaster con ensalada de chucrut y arroz",
"Event-Time": "01\/10\/2020 (Hora De Almuerzo)"},
{
"category": "2",
"name": "patita con mani",
"Event-Time": "02\/10\/2020 (Hora De Almuerzo)"}]
}]

Código Delphi [-]
procedure TForm1.Button2Click(Sender: TObject);
var
  JSo :  TJSONObject;
  JSOarray : TJSONArray;
  JSOValue: TJSONValue;
  remitente, destinatario, mensaje, estado : string;
begin
      JSOarray := TJSONObject.ParseJSONValue(Memo1.Text) as TJSONArray;
      for JSOValue in JSOarray do
      begin
        JSo := TJSONObject.ParseJSONValue(JSOValue.ToJSON) as TJSONObject;
        remitente :=  JSo.Values['category'].ToString;
        destinatario :=  JSo.Values['name'].ToString;
        Memo2.Lines.Add( remitente + '   ' + destinatario );  esto es para efectos de mostrar la informacion
      end;
end;


con este codigo puedo obtener los datos pero solo si el archivo fuera asi

Cita:


[{
"category": "1",
"name": "Pollo broaster con ensalada de chucrut y arroz",
"Event-Time": "01\/10\/2020 (Hora De Almuerzo)"},
}, {
"category": "1",
"name": "xxxxxxxxxxxxx",
"Event-Time": "01\/10\/2020 (Hora De Almuerzo)"},
}, {
"category": "1",
"name": "yyyyyyyyyyyyyyyyyyyyyy",
"Event-Time": "01\/10\/2020 (Hora De Almuerzo)"},
}]

me darias una mano con esto por favor?

engranaje 24-09-2020 11:29:14

Disculpa, pregunto para tener claro si lo he entendido:


Tienes una lista de objetos "cliente".
Cada cliente a su vez tiene una lista de objetos productos.
Cada producto tiene a su vez una lista de clave-valor para categoría, nombre y hora.
Es decir por lo que veo en tu ejemplo el json que cargas te pueden venir n clientes con m productos cada uno.


¿Todo esto es cierto?

movorack 24-09-2020 15:37:58

Debes acceder al contenido del array de productos

Código Delphi [-]
procedure TForm1.Button2Click(Sender: TObject);
var
  i, j: Integer;
  MainArray: TJSONArray;
  MainItem: TJSONObject;
  Products: TJSONArray;
  ProdItem: TJSONObject;
begin
  MainArray := TJSONObject.ParseJSONValue(Memo1.Lines.Text) as TJSONArray;
  for i := 0 to MainArray.Count - 1 do
  begin
    MainItem := TJSONObject.ParseJSONValue(MainArray.Items[i].ToJSON) as TJSONObject;
    Memo2.Lines.Add(Format('%d - plain_orders_USER_mobile_number_13: ',
      [i+1, MainItem.Values['plain_orders_USER_mobile_number_13'].ToString]));

    if Assigned(MainItem.GetValue('products')) then
    begin
      Products := MainItem.GetValue('products') as TJSONArray;
      for j := 0 to Products.count - 1 do
      begin
        ProdItem := TJSONObject.ParseJSONValue(Products.Items[j].ToJSON) as TJSONObject;
        Memo2.Lines.Add(Format('Product: %d:%d - Category: %s - Name: %s - Event-Time: %s',
          [i+1, j+1, ProdItem.Values['category'].ToString, ProdItem.Values['name'].ToString,
           ProdItem.Values['Event-Time'].ToString]));
      end;
    end;
  end;
end;

oscarac 25-09-2020 06:19:26

Cita:

Empezado por movorack (Mensaje 538614)
Debes acceder al contenido del array de productos

Código Delphi [-]
procedure TForm1.Button2Click(Sender: TObject);
var
  i, j: Integer;
  MainArray: TJSONArray;
  MainItem: TJSONObject;
  Products: TJSONArray;
  ProdItem: TJSONObject;
begin
  MainArray := TJSONObject.ParseJSONValue(Memo1.Lines.Text) as TJSONArray;
  for i := 0 to MainArray.Count - 1 do
  begin
    MainItem := TJSONObject.ParseJSONValue(MainArray.Items[i].ToJSON) as TJSONObject;
    Memo2.Lines.Add(Format('%d - plain_orders_USER_mobile_number_13: ',
      [i+1, MainItem.Values['plain_orders_USER_mobile_number_13'].ToString]));

    if Assigned(MainItem.GetValue('products')) then
    begin
      Products := MainItem.GetValue('products') as TJSONArray;
      for j := 0 to Products.count - 1 do
      begin
        ProdItem := TJSONObject.ParseJSONValue(Products.Items[j].ToJSON) as TJSONObject;
        Memo2.Lines.Add(Format('Product: %d:%d - Category: %s - Name: %s - Event-Time: %s',
          [i+1, j+1, ProdItem.Values['category'].ToString, ProdItem.Values['name'].ToString,
           ProdItem.Values['Event-Time'].ToString]));
      end;
    end;
  end;
end;

movorack, simplemente me salvaste la vida....

pero hay algo que me falta

tengo que capturar el dato del cliente, por ejemplo en la primera linea el dato a obtener es. "3242342342342"

muchas gracias

oscarac 25-09-2020 08:11:19

Cita:

Empezado por engranaje (Mensaje 538612)
Disculpa, pregunto para tener claro si lo he entendido:


Tienes una lista de objetos "cliente".
Cada cliente a su vez tiene una lista de objetos productos.
Cada producto tiene a su vez una lista de clave-valor para categoría, nombre y hora.
Es decir por lo que veo en tu ejemplo el json que cargas te pueden venir n clientes con m productos cada uno.


¿Todo esto es cierto?

asi es

existe un cliente, dentro un identificador de productos y dentro la relacion de fechas, productos y categorias

engranaje 25-09-2020 09:54:02

Cita:

Empezado por oscarac (Mensaje 538623)
movorack, simplemente me salvaste la vida....

pero hay algo que me falta

tengo que capturar el dato del cliente, por ejemplo en la primera linea el dato a obtener es. "3242342342342"

muchas gracias

Diría que movorack ya te ha contestado pero es posible que faltara solo un detalle:
Código Delphi [-]
Memo2.Lines.Add(Format('%d - plain_orders_USER_mobile_number_13: %s',        
[i+1, MainItem.Values['plain_orders_USER_mobile_number_13'].ToString]));


La franja horaria es GMT +2. Ahora son las 02:04:59.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi