Estoy tratando de analizar un JSON que se devuelve desde un servicio web REST. El retorno de la llamada get() es un TStringStream. Estoy usando dbxjson para trabajar con los datos. Para hacer las cosas más fáciles de demostrar aquí, he creado un proyecto de prueba que reproduce el error sin llamar al servicio web (en su lugar, utiliza un archivo de texto para el resultado del servicio web). Aquí está el código:JSON matriz vacía
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;
veces la matriz numeros_telefono en estos datos JSON está vacía. En el objeto de secuencia procedente de la llamada de servicio web, se ve así:
{
"Contact Information Service": {
"response": {
"phone_numbers": [
]
}
}
}
Esto hace que ParseJSONValue para devolver un valor nulo.
Sin embargo, si cambio de la matriz numeros_telefono en blanco a esta prueba en mi archivo txt:
{
"Contact Information Service": {
"response": {
"phone_numbers": []
}
}
}
funciona bien (es decir, devuelve un TJSONObject). La diferencia es el espacio en blanco en la matriz vacía. Por algún motivo, la primera respuesta JSON con espacios en blanco en la matriz vacía hace que ParseJSONValue devuelva nulo. Funciona bien, sin espacios en blanco entre los corchetes cuadrados.
¿Qué estoy haciendo mal con mi análisis JSON? ¿Hay algún tipo de pre-análisis que deba hacer antes de llamar a ParseJSONValue?
Parece que es muy probable que sea un error en la implementación de TJSONByteReader, pero francamente tratando de dar sentido al código de análisis hace que sea imposible decirlo de un vistazo. Empíricamente la evidencia es bastante clara. Afortunadamente, mi propio lector TJSONObject maneja estos casos perfectamente. Es hora de publicar tal vez? :) – Deltics
@Deltics: ¿De verdad? Lo rastreé mientras investigaba esta pregunta, y no me resultó tan difícil de entender el código de análisis.Creo que el analizador está mal escrito: este problema se habría evitado por completo si tuviera un léxer adecuado en lugar de mezclar el léxing con el análisis sintáctico, pero no es demasiado difícil entender lo que está pasando ... –
Si has encontrado PeekByte() fácil de entender, entonces debes soñar en hex. :) Cuando publique mi código JSON verá la diferencia entre lo que considero código legible (me atrevo a decir que se puede mantener) y, um, dbxJSON. – Deltics