You are not logged in.
Pages: 1
Hi,
I'm playing with JSON and I face a problem:
Here is a relevant piece of code.
....
sFeatures:= _Json(MemJSON.Lines.Text) ; //Loading text from TMemo
vFeatures := _JsonFast(sFeatures); //vFeatures is Variant
...
vFeatures.Features._(0).properties.Id := 1111; //works well. I can change the value of Id
sLat:= vFeatures.Features._(0).Geometry.Coordinates._(0)._(0)._(0); //Works well. I can read the value and sLat is RawUTF8.
vFeatures.Features._(0).Geometry.Coordinates._(0)._(0)._(0) := sLat; //EVariantDispatchError. I cannot copy back the same value
...
Obviously, I missed something in the documentation. Some ideas?
Thanks
Last edited by DKA (2018-11-23 20:21:45)
Offline
I fixed the problem using TDocVariant like this
var
v: Variant;
vFeatures, vGeometry, vCoordinatesAll, vCoordinates,vLatLong: TDocVariantData;
sFeatures,sTheValue : RawUtf8;
begin
// Load from Memo
sFeatures:= _Json(MemJSON.Lines.Text) ;
v := _JsonFast(sFeatures);
vFeatures := _Safe(v.Features)^;
vGeometry := _Safe(vFeatures.Values[0].Geometry)^;
vCoordinatesAll := _Safe(vGeometry.Values[0])^;
vCoordinates := _Safe(vCoordinatesAll.Values[0])^;
vLatLong := _Safe(vCoordinates.Values[0])^;
vLatLong.Values[0] := '12'; //this works
Offline
Hi again.
Here is a piece of code.
procedure TForm1.Button1Click(Sender: TObject);
var iNbFeatures,j,iNbProperties :integer;
vFeatures, vProperties: TDocVariantData;
v:Variant;
begin
v := _JsonFast('{"features":[{"properties":{"Name":"blabla","Id":11}}]}');
vFeatures := _Safe(v.Features)^;
iNbFeatures:= vFeatures.Count;
for j:=0 to iNbFeatures-1 do
begin
vProperties := _Safe(vFeatures.Values[j].properties)^;
iNbProperties := vProperties.Count; //Here iNbProperties = 2 .
vProperties.Values[1]:= 'NEW VALUE FOR P1'; //Property.value is modified in the debbuger
vProperties.Names[0]:= 'NEW NAME FOTR P0'; //Property.name is modified in the debbuger
vProperties.AddValue('Level', 3);
iNbProperties := vProperties.Count; //Here iNbProperties = 3.
vProperties.AddNameValuesToObject(['RRRR', 'RRRRR']);
iNbProperties := vProperties.Count; //Here iNbProperties = 4.
end;
{
But Here,
v._JSON shows only initial properties modified}
end;
New value of v is :
'{"features":[{"properties":{"NEW NAME FOTR P0":"blabla","Id":"NEW VALUE FOR P1"}}]}'
Only initial properties were modified. I can add property into vProperties but there is no propagation to vFeatures.
Why?
Thanks
Last edited by DKA (2018-11-25 20:17:38)
Offline
You use TDocVariantData local variables, so the values are copied into those, and therefore modifications not propagated.
Use pointers, i.e. the PDocVariantData as returned by _Safe() to modify an existing instance.
Offline
Thanks ab. Changing to PDocVariantData fix the problem.
Offline
Pages: 1