Saltar al contenido

Delphi Rest.JSON JsonToObject solo funciona con variables f

Solución:

La serialización JSON en Delphi se basa en campos, no en propiedades. Pero la mayoría de las clases de Delphi tienen propiedades amigables y campos con prefijo F. Al mismo tiempo, parece que Emb está tratando de evitar los nombres con prefijo F en JSON generado. Cortan la primera “F” del nombre cuando serializan campos y la vuelven a agregar (para encontrar el campo correcto) cuando se leen desde JSON. Parece que la única forma (segura) de usar la serialización JSON en Delphi es mantener todos los nombres de campo con el prefijo “F” (para los campos que desea serializar):

TTestJSON = class
protected
  FName: String;
public
  property Name: String read FName write FName;
end;

ACTUALIZACIÓN2: Como menciona David, podemos usar atributos y luego tenemos un control mucho mejor:

uses
  REST.Json.Types, // without this unit we get warning: W1025 Unsupported language feature: 'custom attribute'
  REST.Json;

type
  // All fields of records are serialized, no control here.
  TRec = record
    RecStr: String;
  end;

  // By default all fields of class are serialized, but only F-prefixed serialized correctly.
  // We can use JSONMarshalled attribute to enable/disable serialization.
  // We can use JSonName attribute to serialize field with specific name in JSON.
  TTestJSON = class
    [JSONMarshalled(True)] [JSonName('RecField')]
    R: TRec;
  end;

procedure TForm28.FormCreate(Sender: TObject);
var
  Test: TTestJSON;
  JsonStr: string;
begin
  Test := TTestJSON.Create;
  try
    Test.R.RecStr := 'Some str';
    JsonStr := TJson.ObjectToJsonString( Test );
  finally
    FreeAndNil(Test);
  end;

  // JsonStr: {"RecField":["Some str"]}

  Test := TJson.JsonToObject<TTestJSON>(JsonStr);
  FreeAndNil(Test);
end;

Esta biblioteca serializa campos. Dado que la práctica común es prefijar campos con la letra F, los diseñadores quieren eliminar esa letra de los nombres utilizados en el JSON. Así que decidieron hacer que el comportamiento predeterminado fuera quitar la primera letra en los campos cuyo nombre comienza con F. Francamente, eso me parece bastante extraño.

Este comportamiento se puede personalizar mediante atributos. Por ejemplo:

[JSONMarshalled(False)]
FFoo: Integer; 

[JSONMarshalled(True)]
[JSONName('Blah')]
Bar: Integer;

Por lo que puedo ver, nada de esto está debidamente documentado.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *