Artigo
· Fev. 17, 2023 4min de leitura

Exportação a JSON- propriedades relacionais e propriedades herdadas

Porque decidi escrever esse artigo

Mais uma vez me surgiu um desafio que me custou algum tempo e muitos testes para obter a melhor solução. E agora que consegui, quero compartilhar meu novo conhecimento

 

O que aconteceu?

Em um namespace havia muitas classes similares, então para deixá-las mais simples há uma superclasse com as propriedades comuns. Além isso, entre essas classes há relações. Eu tinha que exportar uma dessas classes para JSON, mas não poderia mudar nenhuma configuração das superclasses, para não romper o fluxo de outras integrações.

E o que realmente complicou foi que o JSON não poderia ter as propriedades da superclasse. Ai! Eu poderia fazer a exportação e retirá-las uma a ua, mas... e se alguém muda a superclasse?

E o pior... o que acontece com as propriedades de relação? Se exportamos uma propriedade de relação, exportamos outro objeto, com todas as suas propriedades, mas também não podia ter todas elas no JSON.

 

A luz no fim do túnel

Por sorte, sempre há uma luz no fim do túnel e a minha luz é os XData.

A solução é muito simples: chamemos a classe que tinha que exportar de ClasseParaExportacao, a classe da propriedade de relação de ClasseRelacional e a superclasse de SuperClasse.

Assim, temos:

Class projeto.SuperClasse Extends %Persistent {
    Property PropiedadeComum As %String;
}
Class projeto.ClasseParaExportacao Extends projecto.SuperClasse {
    Property PropiedadeParaExportacao As %String;
    Relationship RelacaoParaExportacao As projeto.ClasseRelacional [ Cardinality = many, Inverse = PropiedadeRelacional ];
}
Class projeto.ClasseRelacional Extends projeto.SuperClasse {
    Property NaoExportarEssa As %String;
    Property ExportarEssa As %String;
    Relationship PropiedadeRelacional As projeto.ClasseParaExportacao [ Cardinality = one, Inverse = RelacaoParaExportacao ];
}

 

Na ClasseParaExportacao, escrevo o XData: deve haver um nome e uma tag <Mapping> com tags <Property>. A tag <Mapping> recebe o namespace do xml, ou seja, xmlns="http://intersystems.com/jsonmapping", e as tags <Property> recebem as propriedades descritas em %JSON.MappingProperty¹ (da documentação oficial).

O truque mágico é que tudo o que não está especificado no mapeamento será ignorado. Assim, se mudamos a ClasseParaExportacao para:

Class projeto.ClasseParaExportacao Extends projeto.SuperClasse {
    Property PropiedadeParaExportacao As %String;
    Relationship RelacaoParaExportacao As projeto.ClasseRelacional [ Cardinality = many, Inverse = PropiedadeRelacional ];
    XData MapeamentoJSON {
        <Mapping xmlns = "http://intersystems.com/jsonmapping">
            <Property Name = "PropiedadeParaExportacao" FieldName = "Propiedade-JSON"/>
            <Property Name = "RelacaoParaExportacao" FieldName = "ClasseRelacionalJSON"/>
        </Mapping>
    }
}

vamos ter no JSON algo como:

{
   "Propiedade-JSON":"valor",
   "ClasseRelacionalJSON": [
      {"PropiedadeComum":"valor", "NaoExportarEssa":"valor", "ExportarEssa":"valor"},
      {"PropiedadeComum":"valor", "NaoExportarEssa":"valor", "ExportarEssa":"valor"}
   ]
}

Ou seja, os nomes da ClasseParaExportacao já estão prontos e somente as propriedades que queremos estão no JSON, mas a ClasseRelacional ainda tem trabalho a ser feito.

Então, mudamos a ClasseRelacional com um XData de mesmo nome para ajustar suas propriedades:

Class projeto.ClasseRelacional Extends projeto.SuperClasse {
    Property NaoExportarEssa As %String;
    Property ExportarEssa As %String;
    Relationship PropiedadeRelacional As projeto.ClasseParaExportacao [ Cardinality = one, Inverse = RelacaoParaExportacao ];
    XData MapeamentoJSON
    {
        <Mapping xmlns = "http://intersystems.com/jsonmapping">
            <Property Name = "NaoExportarEssa" Include="None"/>
            <Property Name = "ExportarEssa" Include="INOUT"/>
            <Property Name = "PropiedadeComum" Include="INOUT"/>
        </Mapping>
    }
    
    
}

assim vamos ter no JSON algo como:

{
   "Propiedade-JSON":"valor",
   "ClasseRelacionalJSON": [
      {"PropiedadeComum":"valor", "ExportarEssa":"valor"},
      {"PropiedadeComum":"valor", "ExportarEssa":"valor"}
   ]
}

que é o que queremos.

É interessante observar que para a propriedade "NaoExportarEssa" especifiquei uma tag com Include="None". Isso é o mesmo que não colocar nenhuma  tag para a propriedade.

¹ veja também %JSON.PropertyParameters para entender o que faz cada propriedade.
 

Muito obrigada por ler e espero que o artigo tenha sido útil!

Podéis preguntarme si tenéis dudas o contactarme para que os ayude en algún caso especifico. ¡Estaré encantada de ayudar!

Pode fazer perguntas ou entrar em contato para que eu ajude em algum caso específico. Ficarei feliz em ajudar!

Discussão (0)1
Entre ou crie uma conta para continuar