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 --
LParts:=LJsonObj.Get('parts').JsonValue;
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.
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.
I'm hoping someone knows what the issue might be. Here's the code snippet:
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.
Thank you again and thanks for being patient with me.
Kind Regards,
EEJoe