REST Webサービスから返されるJSONの一部を解析しようとしています。 get()呼び出しからの戻り値はTStringStreamです。 dbxjsonを使用してデータを処理しています。ここで簡単にデモを行うために、Webサービスを呼び出さずにエラーを再現するテストプロジェクトを作成しました(代わりにWebサービス出力のテキストファイルを使用します)。コードは次のとおりです。JSON空の配列
場合によっては、このJSONデータのphone_numbers配列が空です。
{
"Contact Information Service": {
"response": {
"phone_numbers": [
]
}
}
}
これにより、ParseJSONValueはnil値を返します。これにより、Webサービスコールからのストリームオブジェクトが生成されます。しかし
、私は私のテストtxtファイルで、これに空のphone_numbers配列変更した場合:
{
"Contact Information Service": {
"response": {
"phone_numbers": []
}
}
}
を、それが正常に動作します(つまりTJSONObjectが返されます)。違いは、空の配列の空白です。何らかの理由で、空の配列に空白を含む最初のJSON応答が、ParseJSONValueにnilを返します。角括弧の間に空白を入れずにうまく動作します。
JSON解析で何が問題になっていますか? ParseJSONValueを呼び出す前に何らかの事前解析が必要ですか?
TJSONByteReaderの実装ではおそらくバグだと思われますが、率直に言って解析コードを理解しようとすると、一目でわかることができません。経験的に証拠はかなり明確です。 幸いにも自分のTJSONObjectリーダーがこのようなケースを完全にうまく処理します。おそらく公開する時間? :) – Deltics
@Deltics:本当ですか?私はこの質問を調査しながらそれを追跡しましたが、解析コードを理解することが難しいとは思いませんでした。パーサーはひどく書かれていると思う - この問題は、レキシングを解析に混ぜるのではなく、適切なレクサーがあれば完全に回避されるだろうが、何が起こっているのかを理解することは難しくない... –
PeekByte()は理解しやすいので、あなたは16進数で夢を見る必要があります。 :)私がJSONコードを公開すると、私が読める(私が保守可能と言っている)コードとdbxJSONコードの違いがわかります。 – Deltics