VRaptor json include somente um campo

4 respostas
danilomunoz

Olá pessoal,

Existe alguma forma de incluir somente um atributo do meu model para retorno em um JSON?

Por exemplo, imagine que o meu model tem 5 campos e gostaria de retornar somente o campo3. Pensei em duas formas:
#1 result.use(Results.json()).from(myModel, "myModel").include("campo3");
#2 result.use(Results.json()).from(myModel, "myModel").excludeAll().include("campo3");

Eu conheço a existência do exclude, porém tenho que informar todos os campos que desejo remover. Vejo isso como um problema, caso seja adicionado algum campo novo e o programador se esqueça de remover do JSON.

Espero ter sido claro.
Obrigado,

4 Respostas

Rafael_Guerreiro

Que tal se você criar uma classe somente com esse atributo. Pode ser uma inner class mesmo, onde somente a sua classe “mãe” é capaz de instanciar. Ela retorna essa instância em um método e você faz o JSON dessa classe.

Outra alternativa é você fazer um conversor do XStream para essa sua classe, assim toda vez que essa classe aparecer, só serializa aquele atributo.

Outra alternativa é você serializar somente aquele atributo:

result.use(Results.json()).from(myModel.getAtributo()).serialize();
danilomunoz

Oi Rafael, eu entendi … dá pra resolver o problema mas ainda acho que seria bom pensar em alguma melhoria nessa parte. Não sei se cabe ou se é válido sugerir ao pessoal do VRaptor.

Tem outra ponto que é assim: eu comentei sobre somente um campo… mas agora vamos imaginar que são somente 2 campos de 10. Eu poderia fazer assim:

E ainda, um outro caso, seria esse modelo em uma lista com vários objetos deste modelo, porém, em um determinado caso eu gostaria de retornar a lista de todos os modelos somente o campo1. Existe alguma outra forma mais simples, sem a necessidade de ficar implementando conversores específicos para cada caso?

Muito obrigado,

Rafael_Guerreiro

Eu entendi a sua necessidade. Crie uma nova Issue para eles (em inglês):
https://github.com/caelum/vraptor/issues?labels=&state=open

Daquelas opções que eu te passei, eu sugiro que você faça a primeira.

Se você não entendeu, é algo assim:

public class A {
	private final String a;
	private final String b;
	private final String c;
	private final String d;
	private final String e;
	private final String f;

	public class B {
		private final String b;

		private B(String b) {
			this.b = b;
		}
	}

	public B getB() {
		return new B(this.b);
	}
}
danilomunoz

Eu entendi sim … só que achei que o meu model vai ficar um tanto quanto poluído, uma vez que tenho diferentes tipos de visualização conforme o uso.

Assim sendo, preferi montar o JSON na mão:

List<MyModel> models = Controller.getAllModels();
				
				JSONArray array = new JSONArray();
				
				for (MyModel model : models) {
					JSONObject item = new JSONObject();
					item.put("id", model.getId());
					item.put("something", model.getSomething());
					array.put(item);
				}
				
				JSONObject ret = new JSONObject();
				ret.put("models", array);
				result.use(Results.http()).addHeader("Content-Type", "application/json; charset=utf-8").body(ret.toString());

Vou criar a issue sim … quem sabe eles tem alguma idéia para facilitar esta parte.

Obrigado,

Criado 6 de dezembro de 2012
Ultima resposta 6 de dez. de 2012
Respostas 4
Participantes 2