Delphi TJSONArray.ToBytes访问冲突 - 是吗?

时间:2014-09-07 14:13:08

标签: json delphi

问题在于最后的TJSONArray.ToBytes调用。目标TBytes存储库存在。我是否使用SizeOf错误地设置了大小? TJSONArray.Count肯定只给出JSON数组中的对象数。我错过了什么?我为ToBytes的第二个参数尝试了1的偏移量,但它不起作用,我不认为它是正确的索引......

代码成功地将JSON从文件读入iCJSONCallData(TJSONArray对象)。

  // Private variables in the class
    iCJSONAsStr          : string;
    iCJSONBytes          : TBytes;
    iCJSONAllSourceBytes : TBytes;
    iCJSONByteStream     : TBytesStream;
    iCCallData   : TStringList;
    iCJSONCallData  : TJSONArray;
    iCJSONCallSet   : TJSONValue;
    iCJSONParamData : TJSONArray;
.
.
.
    var
      vJSONCalls              : TJSONArray;
      vJSONCallElement        : TJSONObject;
      vJSONCallPair           : TJSONPair;
      vJSONCallEntry          : TJSONString;
      vJSONCallValue          : TJSONValue;
      vJSONCAllDataBytes : TBytes;
      vJSONCallPairEnumerator : TJSONPairEnumerator;
      vJSONCallList           : TStringList;
      vJSONCallDesc           : string;
      vPathCount              : integer;
      vCount : integer;
      vCurrentFileName        : string;


    begin

       if iCJSONByteStream = nil then
        iCJSONByteStream := TBytesStream.Create;

      if vJSONCallList = nil then
        vJSONCallList := TStringList.Create;

      for vCurrentFileName in uCRPCDataFileNames do 
      begin

        iCJSONBytes := TFile.ReadAllBytes(vCurrentFileName);
        iCJSONAsStr := TFile.ReadAllText(vCurrentFileName);

        if iCCallData = nil then
          iCCallData := TStringList.Create;
        if iCJSONCallData = nil then
          iCJSONCallData := TJSONArray.Create();
        if iCJSONCallSet = nil then
          iCJSONCallSet := TJSONValue.Create;

        iCJSONCallSet := TJSONObject.ParseJSONValue(iCJSONBytes , 0);

        if iCJSONCallSet <> nil then
          try
            iCJSONCallData := iCJSONCallSet as TJSONArray;

            try
              for vJSONCallValue in iCJSONCallData do
              begin
                vJSONCallElement := vJSONCallValue as TJSONObject;
                vJSONCallPair    := vJSONCallElement.Get(uCCallKey); //uCCallKey is a string

                vJSONCallEntry := vJSONCallPair.JsonString;

                vJSONCallDesc := vJSONCallPair.JsonValue.ToString;

                iCCallData.Append(vJSONCallDesc);
              end;

            except
              on E : Exception do
              ShowMessage('Error ' + E.Message);
            end;

            SetLength(vJSONCAllDataBytes, SizeOf(iCJSONCallData));
            vCount := iCJSONCallData.ToBytes(vJSONCAllDataBytes, 0); //Access violation... <<<==

          finally


          end;

1 个答案:

答案 0 :(得分:3)

是的,您使用SizeOf()是错误的。 iCJSONCallData是一个对象,因此SizeOf(iCJSONCallData)实际上与SizeOf(Pointer)相同,即32位为4位,64位为8位。

您需要使用TJSONArray.EstimatedByteSize()方法:

SetLength(vJSONCallDataBytes, iCJSONCallData.EstimatedByteSize);
vCount := iCJSONCallData.ToBytes(vJSONCallDataBytes, 0);