Gerar a classe Java do JSON? [fechado]
quero um utilitário que gera ficheiros java fonte a partir do JSON. Por exemplo, temos
{
"firstName": "John",
"lastName": "Smith",
"address": {
"streetAddress": "21 2nd Street",
"city": "New York"
}
}
Passamos isto para o Utilitário e queremos que gere algo assim.
class Address {
JSONObject mInternalJSONObject;
Address (JSONObject json){
mInternalJSONObject = json;
}
String getStreetAddress () {
return mInternalJSONObject.getString("streetAddress");
}
String getCity (){
return mInternalJSONObject.getString("city");
}
}
class Person {
JSONObject mInternalJSONObject;
Person (JSONObject json){
mInternalJSONObject = json;
}
String getFirstName () {
return mInternalJSONObject.getString("firstName");
}
String getLastName (){
return mInternalJSONObject.getString("lastName");
}
Address getAddress (){
return Address(mInternalJSONObject.getString("address"));
}
}
Não é difícil de escrever, mas tenho a certeza que alguém já o fez.
14 answers
Tenta:
Http://www.jsonschema2pojo.org
Orsol, tenho a certeza que ainda não estás à espera de uma solução, mas para o bem da próxima pessoa que encontrar este tópico, pensei em adicionar mais informações. Duas coisas aconteceram desde dezembro de 2009, quando esta pergunta foi feita:O esquema de JSON mudou-se muito. Ainda está em projecto (não finalizado), mas está perto de ser concluído e é agora uma ferramenta viável especificando o seu regras estruturais
Eu comecei recentemente um novo projeto open source especificamente destinado a resolver o seu problema: jsonschema2pojo . A ferramenta jsonschema2pojo possui um documento json schema e gera classes Java de estilo DTO (na forma de .java source files). O projeto ainda não está maduro, mas já fornece cobertura das partes mais úteis do json schema. Estou à procura de mais feedback dos usuários para ajudar a impulsionar o desenvolvimento. Neste momento você pode usar a ferramenta de a linha de comandos ou como um plugin Maven.
Se você está usando Jackson (a biblioteca mais popular lá), tente
Https://github.com/astav/JsonToJava
O seu código aberto e qualquer um deve ser capaz de contribuir.
Resumo
Um gerador de ficheiros de classe fonte JsonToJava que deduz o esquema com base na amostra de dados JSON fornecida e gera as estruturas de dados java necessárias.
Encoraja as equipas a pensar em Json primeiro, antes de escreverem codigo.Características
- pode gerar classes para uma hierarquia arbitrariamente complexa (recursivamente)
- pode ler as suas classes Java existentes e se puder deserializar-se nessas estruturas, fá-lo-á
- irá pedir a entrada do utilizador quando existirem casos ambíguos
Responder a esta velha pergunta com um projecto recente; -).
Neste momento, a melhor solução é provavelmente o JsonSchema2Pojo. : Faz o trabalho a partir do esquema JSON raramente usado, mas também com Json puro. Ele fornece plugin Ant e Maven e um Aplicação de teste online pode dar-lhe uma ideia da ferramenta. Eu coloquei um Tweet Json e gerei toda a classe contendo (Tweet, Usuário, localização, etc..). Vamos usá-lo no projecto Agorava {[5] } para gerar As mídias sociais mapeiam e seguem a evolução contante em sua API. String str =
"{"
+ "'title': 'Computing and Information systems',"
+ "'id' : 1,"
+ "'children' : 'true',"
+ "'groups' : [{"
+ "'title' : 'Level one CIS',"
+ "'id' : 2,"
+ "'children' : 'true',"
+ "'groups' : [{"
+ "'title' : 'Intro To Computing and Internet',"
+ "'id' : 3,"
+ "'children': 'false',"
+ "'groups':[]"
+ "}]"
+ "}]"
+ "}";
JSONObject json = new JSONObject(str);
Iterator<String> iterator = json.keys();
System.out.println("Fields:");
while (iterator.hasNext() ){
System.out.println(String.format("public String %s;", iterator.next()));
}
System.out.println("public void Parse (String str){");
System.out.println("JSONObject json = new JSONObject(str);");
iterator = json.keys();
while (iterator.hasNext() ){
String key = iterator.next();
System.out.println(String.format("this.%s = json.getString(\"%s\");",key,key ));
System.out.println("}");
O código gerado, por padrão, anota para uso com Jackson, mas isto pode ser desligado com um interruptor.
Podes encontrar o código no github: https://github.com/wotifgroup/json2pojo
A principal razão é, eu suspeito, que ao contrário do XML (que tem esquema XML, e então ferramentas como 'xjc' para fazer o que você pede, entre definições XML e POJO), não existe linguagem de esquema de funcionalidades completas. Existe o JSON Schema, mas ele tem muito pouco suporte para definições de tipo reais (foca em estruturas JSON), então seria complicado gerar classes Java. Mas provavelmente ainda é possível, esp. se algumas convenções de nomes fossem definido e usado para suportar a geração.
No entanto: isto é algo que tem sido pedido com bastante frequência( em listas de discussão de projetos de ferramentas JSON que eu sigo), então eu acho que alguém vai escrever tal ferramenta em um futuro próximo.
Então eu não acho que seja uma má idéia per se (também: não é uma boa idéia para todos os casos de uso, depende do que você quer fazer ).
Https://github.com/BrunoAlexandreMendesMartins/CleverModels
Suporta JAVA, C# & Objective-c do JSON .
Sinta-se à vontade para contribuir!Json2Java fornece personalizações como renomear campos, e criar hierarquias de herança.
Usei a ferramenta para criar algumas APIs relativamente complexas:
API do Gracenote: https://github.com/inder123/gracenote-java-api
API do Google Maps Geocoding: https://github.com/inder123/geocoding
Para adicionar ao posto de @japher. Se não estiver particularmente ligado ao JSON, valerá a pena verificar os Buffers de Protocolo .
- Utilizador da função javascript Json.parse (), make string like-json trans to js object
- então use este objeto para genrar o formato javabean. Algo que te importa.(1) mapeamento de tipo de valor,por exemplo,como descobrir a cadeia,é tipo de data.(2)Processo loweser_case to camelCase
Aproveite a partir daqui, eu tenho implantá-lo em servidor web .
Eu tento a sugestão da resposta do top 2.uma web é não pode abrir.uma é mais lenta que a minha ferramenta.espero que gostem da minha ferramenta.Tenta a minha solução.
{
"auctionHouse": "sample string 1",
"bidDate": "2014-05-30T08:20:38.5426521-04:00 ",
"bidPrice": 3,
"bidPrice1": 3.1,
"isYear":true
}
Classe Java Resultado
private String auctionHouse;
private Date bidDate;
private int bidPrice;
private double bidPrice1;
private boolean isYear;
JSONObject get
auctionHouse = obj.getString("auctionHouse");
bidDate = obj.opt("bidDate");
bidPrice = obj.getInt("bidPrice");
bidPrice1 = obj.getDouble("bidPrice1");
isYear = obj.getBoolean("isYear");
JSONObject put
obj.put("auctionHouse",auctionHouse);
obj.put("bidDate",bidDate);
obj.put("bidPrice",bidPrice);
obj.put("bidPrice1",bidPrice1);
obj.put("isYear",isYear);