Modelo de dados - Tiago15Domingues/Project_PA GitHub Wiki
-
Este modelo de dados está preparado para produzir e analisar dados no formato JSON;
-
Está também preparado para instanciar objetos da biblioteca e fazer a sua serialização para texto. Com este modelo de dados é também possível derivar JSON a partir de objetos, podendo o processo ser adaptado por via de anotações nas classes desses objetos.
-
Todos os elementos do JSON são neste modelo de dados objetos do tipo da classe abstrata "JsonElement";
-
Podendo depois esses elementos serem objetos da classe "JsonObject", "JsonArray", "JsonString", "JsonNumber", "JsonBoolean" ou um "JsonNull", consoante o tipo de elemento JSON que se pretende produzir;
-
A classe abstrata "JsonElement" é constítuida por um método "accept(v: Visitor)" (que permite realizar um varrimento simples a um certo "JsonElement", utilizando a função "accept" desse mesmo "JsonElement", através da utilização do padrão de desenhos dos visitantes), uma variável "parent" (que representa o pai associado ao "JsonElement" em questão - que pode ser null caso o "JsonElement" seja o "rootNode" do JSON, ou seja, caso o "JsonElement" tenha na sua constituição todos os outros "JsonElement" do JSON em questão - esta variável poderá ser apenas um "JsonArray", um "JsonObject" ou null) e uma variável "key" (que representa a chave associada ao "JsonElement" em questão - que pode ser null, caso o "JsonElement" em causa não tenha uma "key" associada, caso que acontece quando o "parent" do "JsonElement" é um "JsonArray", caso contrário terá uma "key" que será uma String);
-
Cada elemento do JSON tem um valor. Portanto, cada classe que usa a classe "JsonElement" ("JsonObject", "JsonArray", "JsonString", "JsonNumber", "JsonBoolean" e "JsonNull"), além das propriedades que herda da classe "JsonElement", têm também um valor a elas associado ("JsonArray" - Array de "JsonElement", "JsonString" - String, "JsonNumber" - Number, "JsonBoolean" - Boolean, "JsonNull" - null, "JsonObject" - lista de "JsonElement");
-
Todas as instâncias de "JsonElement" que se usam para criar um JSON serão, no seu processo de criação e associação a um "JsonObject" ou "JsonArray" descartadas. Preservando as características do "JsonElement" em questão na mesma. Isto acontece pois pode acontecer um "JsonElement" ser reutilizado em diferentes profundidades e portanto irá ter diferentes "parents". Dito isto, de forma a ter sempre o "parent" correto associado a cada "JsonElement", é criada sempre uma nova instância de cada "JsonElement" que entra para a criação do JSON.
-
Para criar um JSON pode fazê-lo criando instância das classes que que representam os elementos de um JSON ("JsonObject", "JsonArray", "JsonString", "JsonNumber", "JsonBoolean" e "JsonNull");
-
Para associar os elementos do JSON como acher melhor tem ao seu dispor o método "setProperty" da classe "JsonObject". Para então associar um certo "JsonElement" ao "JsonObject" em questão (aqui estará a defenir o valor do "JsonObject" em causa, nos outros tipos de "JsonElement" essa defenição é feita no momento em que se intância a classe em causa). Sendo necessário, aqui, defenir a "key" que quer associar a esse "JsonElement"; Necessita, para que todos os processos dos modelos de dados funcionem corretamente (e.g "passJsonElementToTextual"), de associar sempre todos os "JsonElement" que cria a um "JsonArray" ou "JsonObject", excepto o "JsonObject" que pretende que seja o root do seu JSON, ou seja, o "JsonElement" que não terá "key" e não terá um "parent" associado a ele. A partir daí, se quiser, pode obter todas as características de todos os seus "JsonElement" individualmente;
-
Caso pretenda analisar e percorrer todos os elementos de um JSON poderá e deverá utilizar o padrão de desenhos dos visitantes utilizando o método "accept" da classe "JsonElement", percorrendo assim todos os "JsonElement" presentes na constituição do "JsonElement" em questão;
-
Caso queira serializar um elemento JSON (um "JsonElement") para texto poderá e deverá utilizar o método "passJsonElementToTextual";
-
Caso queira uma lista com todas as Strings que existem num certo "JsonElement" (elemento do JSON), poderá e deverá utilizar o método "findAllStrings";
-
Caso queira uma lista com todos os "JsonObject", num certo "JsonElement", que tenham uma certa "JsonString" com um certo valor, poderá e deverá utilizar o método "findJsonObjectWithSpecificString";
-
Caso pretenda obter a "key" de um "JsonElement", pronta para ser colocada na serialização para texto de um JSON ou numa árvore na UI, Poderá e deverá utilizar o método "keyToShow" da classe "JsonElement";
-
Caso queira derivar JSON (obter o "JsonElement") a partir de objetos, podendo o processo ser adptado por vias de anotações nas classes desses objetos (podendo omitir (anotação "Exlude") ou alterar o nome associado a uma certa característica ((anotação "NKey"), que será uma futura "key" no JSON, do objeto em questão), poderá e deverá utilizar o método "getJSON" - o método está preparado para qualquer classe, tenham elas um "Int", "String", "Boolean", "Collection", "HasMap", "dataclass", "enum" ou "null" nas suas características.
val jo = JsonObject()
val jn = JsonNumber(123)
jo.setProperty("KeyFor 'jn'",jn)
val js = JsonString("Test")
val jb = JsonBoolean(true)
val jo2 = JsonObject()
val jN = JsonNull(null)
jo2.setProperty("KeyFor 'jN'",jN)
val ja = JsonArray(arrayOf(js,jb,jN,jo2))
jo.setProperty("KeyFor 'ja'",ja)
passJsonElementToTextual(jo)
Presente no visitor presente no método "passJsonElementToTextual"
findAllStrings(ja)
findJsonObjectWithSpecificString(jo,"Peka")
ja.keyToShow(false)
data class Student(
@Exclude
val number: Int?,
@NKey("studentName")
val name: String?,
val repeting: Boolean?,
val bestGrades: Collection<Any>?,
val activities: HashMap<String, String>?,
val bestFriend: Student?,
val studentType: Enum<StudentType>?
)
var studentZeca : Student = Student(8000,"Zeca",true, setOf(12,14), hashMapOf("Indoor" to "Darts","Outside" to "Cross Country"),null,StudentType.Doctoral)
getJSON(studentZeca)