RESTWebサービスから返されるJSONを解析しようとしています。get()呼び出しからの戻り値はTStringStreamです。私はdbxjsonを使用してデータを処理しています。ここで説明しやすくするために、Webサービスを呼び出さずにエラーを再現するテストプロジェクトを作成しました(代わりに、Webサービスの出力にテキストファイルを使用します)。コードは次のとおりです。
var SL : TStringStream;
LJsonObj : TJSONObject;
begin
SL := TStringStream.Create;
try
SL.LoadFromFile('output.txt');
LJsonObj := TJSONObject.ParseJSONValue(TEncoding.ASCII.GetBytes(SL.DataString), 0) as TJSONObject;
finally
SL.Free;
end;
end;
このJSONデータのphone_numbers配列が空の場合があります。Webサービス呼び出しからのストリームオブジェクトでは、次のようになります。
{
"Contact Information Service": {
"response": {
"phone_numbers": [
]
}
}
}
これにより、ParseJSONValueはnil値を返します。
ただし、テストtxtファイルで空のphone_numbers配列をこれに変更すると、次のようになります。
{
"Contact Information Service": {
"response": {
"phone_numbers": []
}
}
}
正常に動作します(つまり、TJSONObjectを返します)。違いは、空の配列の空白です。何らかの理由で、空の配列に空白を含む最初のJSON応答により、ParseJSONValueはnilを返します。中括弧の間に空白がなくても問題なく動作します。
JSON解析で何が間違っていますか?ParseJSONValueを呼び出す前に実行する必要があるある種の事前解析はありますか?