PDA

Ver la Versión Completa : Leer archivo JSON


oscarac
24-09-2020, 01:07:27
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

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
[{
"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

[{
"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)"}]
}]


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



[{
"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


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
Debes acceder al contenido del array de productos


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
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
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:

Memo2.Lines.Add(Format('%d - plain_orders_USER_mobile_number_13: %s',
[i+1, MainItem.Values['plain_orders_USER_mobile_number_13'].ToString]));