json sas sas-ds2

Error al usar el paquete DS2 y JSON



sas sas-ds2 (2)

Estoy tratando de analizar un archivo JSON usando el paquete JSON provisto para proc ds2 en SAS9.3 Maintenance 3 de acuerdo con la publicación del blog de Chris Hemedinger aquí:

http://blogs.sas.com/content/sasdummy/2015/09/28/parse-json-from-sas/

Todo parecía funcionar bien hasta que reinicié mi sesión SAS y ahora sigo recibiendo el mensaje:

ERROR: Compilation error. ERROR: Line 883: Ambiguous method call for method createparser. Multiple method declarations match the given argument list.

La línea 883 (en este caso) se refiere a la línea que contiene la llamada createParser . Aquí hay un código simplificado que puede reproducir el error:

data have; set sashelp.class; run; proc ds2; data want; dcl package json j(); dcl int rc; method run(); set have; rc = j.createParser( name ); end; enddata; run; quit;

¿Qué estoy haciendo mal?


Creo que tienes razón en que esto es un error de SAS, y desafortunadamente no veo una forma de confirmarle a SAS que estás utilizando el método 3 y no el método 4. Simplemente declarar el name como personaje no es suficiente, por alguna razón. Traer un boleto con SAS para esto, sugeriría.

Sin embargo, creo que el método 1 es mejor que el método 2 aquí, dado que realmente no desea especificar el tamaño de inclinación. Simplemente mueva esto a INIT (donde pertenece de todos modos) y use setparserinput , como se sugiere en la documentación :

data have; set sashelp.class; run; proc ds2; data want; dcl package json j(); dcl double rc; method init(); rc = j.createParser(); j.setParserInput(name); end; method run(); set have; end; enddata; run; quit;

Además, parece que la razón por la que el ejemplo funciona es el argumento del character set . UTF-8 o Unicode funcionarán (este último no funcionará por otras razones pero no se romperá por este motivo), mientras que WLatin1 , ANSI o ASCII no funcionarán. Al parecer, establecerlo como un personaje UTF-8 hace que SAS se de cuenta de que es realmente el personaje?

data have; set sashelp.class; run; proc ds2; data want(overwrite=yes); dcl package json j(); dcl char(50) character set utf8 name; dcl double rc; method init(); rc = j.createParser( name ); end; method run(); set have; end; enddata; run; quit;


De acuerdo con la documentación ( https://support.sas.com/documentation/cdl/en/ds2ref/68052/HTML/default/viewer.htm#n1w9ms65zrao57n1p1yt4029jcwt.htm ) utilizan la sobrecarga de métodos en createParser. Hay 4 métodos para elegir y parece que de alguna manera SAS no puede decir cuál de los 4 estoy tratando de llamar:

Formulario 1:

package.CREATEPARSER ( );

Forma 2:

package.CREATEPARSER (json-text, tipping-size);

Formulario 3:

package.CREATEPARSER (json-text);

Forma 4:

package.CREATEPARSER (tipping-size);

Encontré una solución fea que es simplemente llamar al Formulario 2 para que la llamada no sea ambigua. Establecí el punto de inflexión en 32767 ya que estoy trabajando con datos en tablas SAS y ninguno de los resultados será más largo que eso de todos modos. Código final:

proc ds2; data want (overwrite=yes); dcl package json j(); dcl int rc; method init(); set have; rc = j.createParser( name , 32767 ); end; enddata; %runquit;