просто маршалиране демаршалиране на обекти

Поддръжката на json е една от новите функции на delphi 2009 и delphi 2010. Искам да знам дали има някаква проста функция за маршалинг/демаршалинг директно между низ и обект като в библиотеката на суперобекти.

Пример:

MyKnownObject := FromJSON('{name:"francis", surname:"lee"}');

person Francis Lee    schedule 11.01.2010    source източник
comment
Знам, че има вградена поддръжка за JSON marshalling в D2010, но не съм сигурен как точно работи.   -  person Mason Wheeler    schedule 11.01.2010


Отговори (2)


Десериализиране на низ директно към TJSONObject

var
  ConvertFrom: String;
  JSON: TJSONObject;
  StringBytes: TBytes;
  I: Integer;
begin
  ConvertFrom := '{"name":"somebody on SO","age":"123"}';
  StringBytes := TEncoding.ASCII.GetBytes(ConvertFrom);
  JSON := TJSONObject.Create;
  try
    JSON.Parse(StringBytes, 0);
    Assert(JSON.ToString = ConvertFrom, 'Conversion test');
    Memo1.Lines.Add(JSON.ToString);

    for I := 0 to JSON.Size - 1 do
      Memo1.Lines.Add(JSON.Get(I).JsonString.Value + 
         ' : ' + JSON.Get(I).JsonValue.Value);

  finally
    JSON.Free;
  end;
end;
person Juraj Blahunka    schedule 15.02.2010

Вижте тук. По-долу е изрязана интересната част:

procedure TForm13.Button4Click(Sender: TObject);
var
  LContact: TContact;
  oMarshaller: TJSONMarshall;
  crtVal: TJSONValue;
begin
  LContact:=TContact.Create; //our custom class
  LContact.Name:='wings-of-wind.com';
  LContact.Age:=20; //fill with some data
  oMarshaller:=TJSONMarshal.Create(TJSONConverter.Create); //our engine
  try
    crtVal:=oMarshaller.Marshal(LContact); //serialize to JSON
    Memo1.Text:=crtVal.ToString; //display
  finally //cleanup
    FreeAndNil(LContact);
    FreeAndNil(oMarshaller);
  end;
end;

Също така можете да видите тук по-сложен пример от Adrian Andrei (архитектът на DataSnap), както и пример за персонализирано маршалинг тук.

person John Thomas    schedule 11.01.2010
comment
А какво да кажем за демаршалинг? - person Francis Lee; 11.01.2010
comment
@Francis unmarshalling се обсъжда в свързаните статии. - person skamradt; 11.01.2010
comment
@skamradt примери за демаршали от TJsonValue, а не от низ. - person Francis Lee; 11.01.2010
comment
Първата връзка е повредена. - person Z80; 16.08.2017
comment
Забележка за себе си (и за другите): има клас TJSONMarshal/TJSONUnMarshal, дефиниран също в REST.JsonReflect. Не използвайте това, вместо това използвайте класа в DBXJSONReflect! - person Z80; 16.08.2017
comment
Кодът в свързаната статия е остарял - не компилира Delphi XE7 - person Z80; 16.08.2017