我想解析從REST Web服務返回的一些JSON。 get()調用的返回是一個TStringStream。我使用dbxjson來處理數據。爲了使這裏更容易演示,我創建了一個測試項目,它在不調用Web服務的情況下重現錯誤(改爲使用Web服務輸出的文本文件)。以下是代碼:JSON空陣列
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返回一個零值。
但是,如果我改變了空PHONE_NUMBERS數組這在我的測試txt文件:
{
"Contact Information Service": {
"response": {
"phone_numbers": []
}
}
}
它工作正常(即返回TJSONObject)。不同之處在於空數組中的空白。出於某種原因,空數組中的第一個帶有空白的JSON響應會導致ParseJSONValue返回nil。它工作正常,方括號之間沒有空白。
我在做什麼錯我的JSON解析?在調用ParseJSONValue之前,我需要做某種預解析嗎?
看起來這很可能是TJSONByteReader實現中的一個錯誤,但坦率地說,要理解解析代碼使得無法一目瞭然。經驗上證據是非常清楚的。 幸運的是我自己的TJSONObject閱讀器可以很好地處理這種情況。可能發佈時間? :) – Deltics
@Deltics:真的嗎?我在調查這個問題的同時追溯了它,並且我沒有覺得難以理解解析代碼。我認爲解析器編寫得很糟糕 - 如果它有一個合適的詞法分析器,而不是將解析器中的文法混合在一起,這個問題就可以完全避免 - 但是不難理解正在發生什麼...... –
如果您發現PeekByte()易於理解,那麼你必須在十六進制夢。 :)當我發佈我的JSON代碼時,你會看到我認爲可讀(我敢說可維護)代碼和um,dbxJSON之間的區別。 – Deltics