es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Uso de ulkJson en Delphi 6

Digamos que tengo un código como este:

  json:= TlkJSON.ParseText(Memo1.Text);
  if Assigned(json) then
  begin
    json:= json.Field['journals'];
    if Assigned(json) then
    begin
      json:= json.Field['journal_details'];
      if Assigned(json) then
      begin
        Memo2.Lines.Add(VarToStr(json.Child[0].Value));
      end;
    end;
  end;

Se utiliza para rastrear si mi objeto JSON tenía el campo “journals” y “journal_details”.

Quiero hacerlo más dinámico para que pueda detectar si el valor en el objeto JSON era un array/lista/lista personalizada y contenga todos los mensajes de error detallados que deseo volver a traducir para que el usuario pueda entender el mensaje.

Cualquier pista será apreciada.

Como recomendación de @MyICQ, este es un fragmento de datos que quiero volver a traducir:

[{"code":"H003","validations":["phone_invalid_format"]},{"code":"H004","validations":["phone_invalid_format"]},{"code":"H005","validations":["phone_invalid_format"]},{"code":"H006","validations":["phone_invalid_format"]},{"code":"H010","validations":["phone_invalid_format"]}]

Con la nota de que la estructura de la cadena no siempre es la misma.

Este es el resultado que deseo tener al menos:

Lista de errores de datos:
> H003: Nota = Formato de teléfono inválido
> H004: Nota = Formato de teléfono inválido
> H005: Nota = Formato de teléfono inválido
> H006: Nota = Formato de teléfono inválido
> H010: Nota = Formato de teléfono inválido

Hasta ahora, todo lo que he logrado es detectar cuántos arrays u objetos hay en la cadena, pero he fallado al recuperar el valor en ellos.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para hacer el código más dinámico y recuperar los mensajes de error del objeto JSON, puedes utilizar la información de tipo en tiempo de ejecución (RTTI) de Delphi para determinar el tipo del campo y luego recuperar los valores correspondientemente. Aquí tienes una posible solución:

    procedure GetErrorMessages(json: TlkJSONBase; errMsgs: TStrings);
    var
      i: Integer;
      field: TlkJSONBase;
      info: PTypeInfo;
      typeName: string;
      arr: TlkJSONList;
      obj: TlkJSONObject;
    begin
      if json = nil then Exit;
    
      field := json.Field['code'];
      if field <> nil then
      begin
        // Recuperar el mensaje de error
        errMsgs.Add(Format('%s : Note = %s', [VarToStr(field.Value), 'Phone_invalid_format']));
      end
      else
      begin
        // Determinar el tipo del campo
        info := json.ClassInfo;
        typeName := info.TypeName;
    
        if typeName = 'TlkJSONList' then
        begin
          // Iterar sobre array/lista
          arr := TlkJSONList(json);
          for i := 0 to arr.Count - 1 do
            GetErrorMessages(arr.Child[i], errMsgs);
        end
        else if typeName = 'TlkJSONObject' then
        begin
          // Iterar sobre objeto
          obj := TlkJSONObject(json);
          for i := 0 to obj.Count - 1 do
            GetErrorMessages(obj.FieldByIndex(i), errMsgs);
        end;
      end;
    end;
    

    Este procedimiento recibe el objeto JSON y una instancia de TStrings para almacenar los mensajes de error. Primero verifica si existe el campo code y recupera el mensaje de error. Si no existe, determina el tipo del campo e itera sobre él en consecuencia.

    Ten en cuenta que esta solución asume que el mensaje de error es siempre el mismo ('Phone_invalid_format') y que el campo code siempre existe. Es posible que necesites modificar el código para manejar diferentes casos.

    Para utilizar este procedimiento, puedes llamarlo de la siguiente manera:

    var
      json: TlkJSONBase;
      errMsgs: TStringList;
    begin
      json := TlkJSON.ParseText(Memo1.Text);
      if Assigned(json) then
      begin
        json := json.Field['journals'];
        if Assigned(json) then
        begin
          json := json.Field['journal_details'];
          if Assigned(json) then
          begin
            errMsgs := TStringList.Create;
            try
              GetErrorMessages(json, errMsgs);
              Memo2.Lines.Assign(errMsgs);
            finally
              errMsgs.Free;
            end;
          end;
        end;
      end;
    end;
    

    Este código analiza el objeto JSON y recupera el campo journal_details. Luego llama a GetErrorMessages para recuperar los mensajes de error y los asigna a Memo2.

Comments are closed.