title: Delphi - Access Violation on Parsing JSON Data @ Run Time
body: <p>New to the forums so apologies if my posts are not well formatted or following the guidelines.  I'll 'get it' quickly.  So here's my issue.  Have a look at the code below.  I have removed almost all of the extranneous bits to focus attention on one key line --</p>
  
  <pre><code>LParts:=LJsonObj.Get('parts').JsonValue;
  </code></pre>
  
  <p>I have some JSON formatted data along the top (Const) that has been tested to be valid.  When I attempt to parse it, it fails at run time (compile time is fine).  I've reduced all of this to something smaller and more manageable to deal with.</p>
  
  <p>When I launch this in the debugger, it all seems valid, yet even having added tests for Nil values doesn't yield much in my understanding of the problem.</p>
  
  <p>I'm hoping someone knows what the issue might be.  Here's the code snippet:</p>
  
  <pre><code>program ReadJSONConsoleApp;
  
  {$APPTYPE CONSOLE}
  
  {$R *.res}
  
  uses
    DBXJSON,
    System.SysUtils;
  
  
  Const
  StrJson=
  '{' +
  '    "response": {' +
  '        "distributor": {' +
  '            "id": 1538,' +
  '            "name": "Arrow Electronics",' +
  '            "authorized": true,' +
  '            "logoUrl": "this is normally a URL but I cut it out"' +
  '        },' +
  '        "parts": [' +
  '            {' +
  '                "manufacturer": "National Semiconductor",' +
  '                "part": "LM741WG/883",' +
  '                "description": "OP Amp Single GP ±22V 10-Pin CFPAK Tray",' +
  '                "price": [' +
  '                    {' +
  '                        "quantity": 0,' +
  '                        "price": 65,' +
  '                        "currency": "USD"' +
  '                    }' +
  '                ],' +
  '                "stock": 88,' +
  '                "lastUpdated": "2013-11-04 18:27:16 UTC"' +
  '            },' +
  '            {' +
  '                "manufacturer": "National Semiconductor",' +
  '                "part": "LM741W/883",' +
  '                "description": "OP Amp Single GP ±22V 10-Pin CPAK Rail",' +
  '                "price": [' +
  '                    {' +
  '                        "quantity": 0,' +
  '                        "price": 40.5,' +
  '                        "currency": "USD"' +
  '                    }' +
  '                ],' +
  '                "stock": 1464,' +
  '                "lastUpdated": "2013-11-04 18:27:16 UTC"' +
  '            },' +
  '            {' +
  '                "manufacturer": "Texas Instruments",' +
  '                "part": "LM741CH",' +
  '                "description": "OP Amp Single GP ±18V 8-Pin TO-99 Box",' +
  '                "price": [' +
  '                    {' +
  '                        "quantity": 0,' +
  '                        "price": 5.22,' +
  '                        "currency": "USD"' +
  '                    }' +
  '                ],' +
  '                "stock": 95,' +
  '                "lastUpdated": "2013-11-04 18:27:16 UTC"' +
  '            }' +
  '        ]' +
  '    }' +
  '}';
  
  procedure ParseJson;
  var
    LJsonObj  : TJSONObject;
    LJPair    : TJSONPair;
    LParts    : TJSONValue;
    LPart     : TJSONValue;
    LItem     : TJSONValue;
    LIndex    : Integer;
    LSize     : Integer;
  begin
      LJsonObj    := TJSONObject.ParseJSONValue(TEncoding.ASCII.GetBytes(StrJson),0) as TJSONObject;
    try
       LParts:=LJsonObj.Get('parts').JsonValue;
       {LSize:=TJSONArray(LParts).Size;
       for LIndex:=0 to LSize-1 do
       begin
        LPart := TJSONArray(LParts).Get(LIndex);
        LJPair   := TJSONPair(LPart);
        Writeln(Format('Part Name %s',[LJPair.JsonString.Value]));
          for LItem in TJSONArray(LJPair.JsonValue) do
          begin
             if TJSONPair(LItem).JsonValue is TJSONFalse then
              Writeln(Format('  %s : %s',[TJSONPair(LItem).JsonString.Value, 'false']))
             else
             if TJSONPair(LItem).JsonValue is TJSONTrue then
              Writeln(Format('  %s : %s',[TJSONPair(LItem).JsonString.Value, 'true']))
             else
              Writeln(Format('  %s : %s',[TJSONPair(LItem).JsonString.Value, TJSONPair(LItem).JsonValue.Value]));
          end;
       end; }
    finally
       LJsonObj.Free;
    end;
  end;
  
  begin
    try
      ParseJson;
    except
      on E: Exception do
        Writeln(E.ClassName, ': ', E.Message);
    end;
    Readln;
  end.
  </code></pre>
  
  <p>Thank you again and thanks for being patient with me.</p>
  
  <p>Kind Regards,</p>
  
  <p>EEJoe</p>