Lidando com diferenças de JSON por causa de versões anteriores

Qual a melhor forma de lidar com o seguinte problema:

Tenho uma aplicação mobile iPhone e Android que enviam e recebem dados para um Webservice utilizando JSON. Minha aplicação precisa funcionar offline, com usuários podendo ficar semanas sem internet, e quando conseguirem conexão, o server recebe os dados e sincroniza.

No entanto, se houver uma mudança no Webservice nesse meio tempo, o JSON esperado pode mudar (exigencia do cliente). Minha solução foi fazer uma camada de tratamento no Webservice que recebe pelo JSON a versão do App e converte os dados para o formato que o mesmo espera.
O problema é que cada versão que haja uma mudança dessas exige que seja atualizado a camada de tratamento para cada uma das versões anteriores.

Gostaria de saber se existe um método melhor para tratar esse caso ou se já estou utilizando o melhor método.

Grato.

A graça do JSON, fora a simplicidade, é de que objeto pode ter seu formato alterado em qualquer momento durante a programação. Você não precisa ter todos os atributos previamente definidos, é só ir usando conforme a necessidade, mas não temos isso no Java.

Se a sua aplicação precisar ser compatível com todas as versões de clientes, talvez o melhor seja uma classe especializada no tratamento como você já está fazendo. Sempre que estiver escrevendo e modelando a sua aplicação, tente buscar ao máximo a alta coesão (cada classe com funcionalidades bem especificas e delimitadas) e o baixo acoplamento entre as classes do sistema.

Obrigado pelo retorno @aresmaverick, pela sua resposta vejo que a solução de utilizar a camada de tratamento no server seja o melhor caso mesmo.

Mas agora sendo mais específico na camada de tratamento, eu estou tratando da seguinte forma:

  1. AJAX recebe o JSON do via POST, faz uma validação simples e passa-o para a classe AppDecoderGeral;
  2. AppDecoderGeral verifica a versão e instancia a classe responsável pela respectiva versão do app (ex: AppDecoderAndroid70);
  3. Classe AppDecoderAndroid70 instancia os models de acordo com suas regras;
  4. Models são tratados pelos Controllers e DAOs, etc;

Meu problema está no passo 3, pois pensei em utilizar interfaces, no entanto, uma versão anterior pode não instanciar models que em versões mais recentes sejam obrigatórios (por exemplo quando uma nova funcionalidade é implementada).

Por enquanto estou seguindo tratando caso a caso, atualizando cada AppDecoder para lidar com novas funcionalidades, mas vejo que assim essas classes irão crescer indefinidamente.

Então,

Você já ouvir falar no Open Close Principle? Ele diz que a sua classe deve ser fechada para alteração e aberta para extensão. O que pode ser traduzido em: sua classe deve permitir alterações que adicionem funcionalidades sem perturbar o que já está funcionando.

Esse processo facilita o reaproveitamento de código e com certeza vai te ajudar a trabalhar com caras que sejam de versões diferentes.

Espero ter plantado a semente da dúvida e que você possa repensar a tua aplicação.