VRaptor json include somente um campo

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,

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(); 

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,

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);
	}
}

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,