Ver Mensaje Individual
  #4  
Antiguo 21-05-2019
PEIIB PEIIB is offline
Miembro
 
Registrado: mar 2016
Posts: 19
Reputación: 0
PEIIB Va por buen camino
Hola buenas, hace unos días que estoy lidiando con el ejemplo de este hilo. De momento he conseguido leer los datos de una web api, mediante post y obtener el texto legible del Json, pero no consigo parsear los datos a un TclientDataset.
El código que tengo para ello, siguiendo el ejemplo de Neftalí és el siguiente:

Código Delphi [-]
procedure TForm2.ParseResponse(AObjResp: TlkJSONobject);
var
  objUserList:TlkJSONlist;
  objUser, objtmp:TlkJSONobject;
  i:integer;
  Str:String;
  cds:TClientDataSet;
begin
  // Limpiar el contenido
  cds := ClientDataSet1;
  cds.EmptyDataSet;
  showmessage(IntToStr(AObjResp.Count));     //Sí, hay 1032 datos

  // Objeto Check?
  if (AObjResp.IndexOfName('Check') <> -1) then begin       //Aquí da error    Access violation xxxx read of adress yyyy
    // Lo almaceamos en un tipo "lista"
    TlkJSONBase(objUserList) := AObjResp.Field['Check'];
    // Recorrer la lista de usuarios.
    for i := 0 to (objUserList.Count - 1) do begin
      // Objeto usuario
      TlkJSONBase(objUser) := objUserList.Child[i];
      TlkJSONBase(objtmp) := objUser.FieldByIndex[0];
      // Añadimos un registro al CDS
      cds.Append;
      try
        // Recoger los campos del objeto
        cds.FieldByName('id').AsString :=        VarToStr(objtmp.Field['id'].Value);
        cds.FieldByName('date').AsDateTime :=    VarToDateTime(objtmp.Field['date'].Value);
        cds.FieldByName('user_id').AsString :=   VarToStr(objtmp.Field['user_id'].Value);
        cds.FieldByName('admin_id').AsString :=  VarToStr(objtmp.Field['admin_id'].Value);
        cds.FieldByName('latitude').AsString :=  VarToStr(objtmp.Field['latitude'].Value);
        cds.FieldByName('longitude').AsString := VarToStr(objtmp.Field['longitude'].Value);
        cds.FieldByName('comment').AsString :=   VarToStr(objtmp.Field['comment'].Value);
        cds.FieldByName('type').AsString :=      VarToStr(objtmp.Field['type'].Value);
        cds.FieldByName('ip').AsString :=        VarToStr(objtmp.Field['ip'].Value);
        cds.FieldByName('from').AsString :=      VarToStr(objtmp.Field['from'].Value);
        cds.FieldByName('changed').AsString :=   VarToStr(objtmp.Field['changed'].Value);
        // Grabar
        cds.Post;
      finally
        cds.Cancel;
      end;
    end;
  end;

end;

Y el Json viene cargado con datos de este tipo:
Código:
[
  {
    "Check":{
      "id":"5cbe8e5b-9f0c-4c02-bc1b-4629bca5fb54",
      "date":"2019-04-23 04:02:35",
      "created":"2019-04-23 06:02:35",
      "modified":"2019-04-23 06:02:35",
      "user_id":"56657074-4e7c-4fe6-82b8-3b54bca5fb54",
      "admin_id":null,
      "latitude":"41.8696479797",
      "longitude":"2.4183871746",
      "comment":null,
      "type":"1",
      "ip":"31.4.188.115",
      "from":null,
      "changed":"0"
    }
  },
  {
    "Check":{
      "id":"5cbebab1-81bc-43c5-b244-5e4abca5fb54",
      "date":"2019-04-23 06:40:00",
      "created":"2019-04-23 09:11:45",
      "modified":"2019-04-23 10:12:18",
      "user_id":"56657074-4e7c-4fe6-82b8-3b54bca5fb54",
      "admin_id":"566e5a86-3aec-48a7-90d9-15b6bca5fb54",
      "latitude":null,
      "longitude":null,
      "comment":null,
      "type":"1",
      "ip":null,
      "from":null,
      "changed":"0"
    }
  },
  {
    "Check":{
      "id":"5cbeba9a-63f8-47d7-9903-5e4abca5fb54",
      "date":"2019-04-23 07:11:22",
      "created":"2019-04-23 09:11:22",
...
...
la línea:
if (AObjResp.IndexOfName('Check') <> -1) then begin
provoca un error Access violation xxxx read of adress yyyy

Podeis echarme una mano? Cualquier cosa que intento me da error y no se como continuar.

Gracias de antemano
Responder Con Cita