Escrito por

Desenvolvedor at QI Tech
Artigo Heloisa Paiva · 3 hr atrás 2m read

Consultas SQL JSON Simplificadas.

Ir para o posto original@David Hockenbroch

Inspirado pela postagem de @Ashok Kumar T no portal de ideias aqui, bem como pelos meus próprios desejos de uma solução para este problema, criei uma maneira simples de permitir consultas JSON mais completas e consistentes sem ter que especificar cada campo desejado. Desenvolvi uma classe que estende a classe integrada %JSON.Adaptor e torna seus métodos %JSONExportToString e %JSONExportToStream acessíveis através de SQL com apenas alguns métodos SqlProc simples.

Class DH.JSONAdaptor Extends %JSON.Adaptor [ Abstract ]
{
ClassMethod jsonstring(id, map = "") [ SqlProc ]
{
	try{
		set myobj = ..%OpenId(id)
		set sc = myobj.%JSONExportToString(.json,map)
		if $$$ISERR(sc) $$$ThrowStatus(sc)
		return json
	}
		catch ex{
		throw ex
	}
}

ClassMethod jsonstream(id, map = "") [ SqlProc ]
{
	try{
		set myobj = ..%OpenId(id)
		set sc = myobj.%JSONExportToStream(.json,map)
		if $$$ISERR(sc) $$$ThrowStatus(sc)
		return json
	}
	catch ex{
		throw ex
	}
}
}

Isso permite ao usuário obter os resultados desses métodos em colunas de uma consulta SQL de forma muito eficiente. Por exemplo, suponha que tenhamos a seguinte classe:

Class User.Name Extends (%Persistent, DH.JSONAdaptor)
{

XData NoMiddle
{
<Mapping xmlns = "http://www.intersystems.com/jsonmapping" >
	<Property Name="First" FieldName="First" />
	<Property Name="Last" FieldName="Last" />
</Mapping>
}

Property First As %String;

Property Middle As %String;

Property Last As %String;
}

Então poderíamos consultar da seguinte forma, fornecendo a coluna id ao SqlProc para obter o mapeamento de objeto JSON padrão:

Ou, como temos um mapeamento JSON adicional definido nesta classe, também podemos fornecer o argumento opcional map para usar esse mapeamento em vez do padrão:

Embora esta não seja uma solução perfeita para a ideia sugerida, já que exige que a classe estenda esta classe específica, acredito que seja um passo na direção certa, e não faria mal que isso fosse incluído no %JSON.Adaptor nativo no futuro.

Este pacote está disponível aqui no Open Exchange, ou você pode instalá-lo no InterSystems Package Manager usando o comando "install sqljsonadaptor".