Próbuję przeanalizować niektóre JSON, które są zwracane z usługi sieciowej REST. Zwrot z wywołania get() to TStringStream. Używam dbxjson do pracy z danymi. Aby ułatwić tutaj prezentację, utworzyłem projekt testowy, który odtwarza błąd bez wywoływania usługi sieciowej (zamiast tego używa pliku tekstowego do wyświetlenia usługi WWW). Oto kod:Pusta tablica 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;
Czasami tablica phone_numbers w tym danych JSON jest pusty. W obiekcie Strumień pochodzący z wzywania serwisu www, wygląda to tak:
{
"Contact Information Service": {
"response": {
"phone_numbers": [
]
}
}
}
Powoduje ParseJSONValue zwrócić wartość zero.
Jednak jeśli zmienię pusty phone_numbers tablicę do tego w moim testowym pliku txt:
{
"Contact Information Service": {
"response": {
"phone_numbers": []
}
}
}
działa dobrze (tzn zwraca TJSONObject). Różnica jest białą spacją w pustej tablicy. Z jakiegoś powodu pierwsza odpowiedź JSON z białymi znakami w pustej tablicy powoduje, że ParseJSONValue zwróci zero. Działa dobrze bez białych spacji między nawiasami kwadratowymi.
Co robię źle z moim parsowania JSON? Czy jest jakiś rodzaj wstępnego parsowania, które muszę wykonać przed wywołaniem ParseJSONValue?
Wygląda na to, że to najprawdopodobniej błąd w implementacji TJSONByteReader, ale szczerze mówiąc, próbując zrozumieć kod parsujący, nie można tego stwierdzić na pierwszy rzut oka. Empirycznie dowody są dość jasne. Na szczęście mój własny czytnik TJSONObject doskonale radzi sobie z takimi przypadkami. Czas na opublikowanie? :) – Deltics
@Deltics: Naprawdę? Przeszukałem to podczas badania tego pytania i nie było mi trudno zrozumieć kod parsujący.Wydaje mi się, że parser jest źle napisany - problem ten zostałby całkowicie wyeliminowany, gdyby miał odpowiedni lexer zamiast mieszać leksyk z analizą - ale nie jest zbyt trudno zrozumieć, co się dzieje ... –
Jeśli znalazłeś PeekByte() łatwe do zrozumienia, musisz śnić na heksie. :) Kiedy opublikuję mój kod JSON, zobaczysz różnicę między tym, co uważam za czytelny (odważ się twierdzić, że można to naprawić) a um, dbxJSON. – Deltics