Создать Java-класс из JSON?

Мне нужна утилита, которая генерирует исходные JAV файлы из JSON. Например, мы имеем

{
  "firstName": "John",  
  "lastName": "Smith",  
  "address": {  
    "streetAddress": "21 2nd Street",  
     "city": "New York"
  }
}

Мы передаем это утилите, и мы хотим, чтобы она генерировала что-то вроде этого:

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

Не так сложно писать, но я уверен, что кто-то уже это сделал.

Ответ 1

Try:

http://www.jsonschema2pojo.org

Орсол, я уверен, что вы все еще не ждали решения здесь, но ради следующего человека, который нашел этот поток, я подумал, что добавлю дополнительную информацию.

Две вещи произошли с декабря 2009 года, когда был задан этот вопрос:

  • Спецификация JSON Schema сильно изменилась. Он все еще находится в проекте (не завершен), но он близок к завершению и теперь является жизнеспособным инструментом, определяющим ваши структурные правила.

  • Недавно я начал новый проект с открытым исходным кодом, специально предназначенный для решения вашей проблемы: jsonschema2pojo. Инструмент jsonschema2pojo принимает документ схемы json и генерирует классы Java в стиле DTO (в виде исходных файлов .java). Проект еще не созрел, но уже обеспечивает покрытие наиболее полезных частей json-схемы. Я ищу больше отзывов от пользователей, чтобы помочь вам в развитии. Прямо сейчас вы можете использовать инструмент из командной строки или как плагин Maven.

Надеюсь, это поможет!

Ответ 2

Если вы используете Джексон (самая популярная библиотека там), попробуйте

https://github.com/astav/JsonToJava

С открытым исходным кодом, и каждый должен быть в состоянии внести свой вклад.

Сводка

Генератор файлов исходного кода JsonToJava, который выводит схему на основе предоставленных образцов json-данных и генерирует необходимые структуры данных java.

Это побуждает команды сначала подумать в Json, прежде чем писать фактический код.

Функции

  • Может генерировать классы для произвольно сложной иерархии (рекурсивно)
  • Может читать ваши существующие классы Java и, если он может десериализоваться в этих структурах, сделает это
  • Будет запрашивать ввод пользователя, если существуют двусмысленные случаи.

Ответ 3

Не похоже, что JSON Gen (принятый ответ) был обновлен через некоторое время. http://javafromjson.dashingrocket.com выглядит хорошо, хотя

Ответ 4

Здесь онлайн-инструмент, который займет JSON, включая вложенные объекты или вложенные массивы объектов и сгенерирует источник Java с аннотациями Джексона.

Ответ 5

Отвечая на этот старый вопрос с недавним проектом; -).

В настоящее время лучшим решением является, вероятно, JsonSchema2Pojo:

Это делает работу из редко используемой Json Schema, но также с простым Json. Он обеспечивает Ant, а плагин Maven и онлайн-приложение для тестирования может дать вам представление об этом инструменте. Я поставил Json Tweet и создал весь содержащий класс (Tweet, User, Location и т.д.).

Мы будем использовать его в проекте Agorava для создания отображения социальных сетей и последующего развития эволюции в их API.

Ответ 6

Спасибо всем, кто пытался помочь.
Для меня этот script был полезен. Он обрабатывает только плоский JSON и не заботится о типах, но автоматизирует некоторые обычные

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

Ответ 7

Я знаю, что это старый вопрос, но я наткнулся на него, пытаясь найти ответ сам.

Ответ, в котором упоминается генератор json-pojo онлайн (jsongen), хорош, но мне нужно что-то, что я мог бы запустить в командной строке и настроить больше.

Итак, я написал очень хакерский ruby ​​ script, чтобы взять образец файла JSON и сгенерировать POJO. Он имеет ряд ограничений (например, он не обрабатывает поля, соответствующие ключевым словам, зарезервированным для Java), но он достаточно для многих случаев.

Сгенерированный код по умолчанию аннотируется для использования с Jackson, но это можно отключить с помощью переключателя.

Вы можете найти код в github: https://github.com/wotifgroup/json2pojo

Ответ 8

Насколько я знаю, такого инструмента нет. Тем не менее.

Основная причина заключается в том, что я подозреваю, что в отличие от XML (который имеет XML-схему, а затем такие инструменты, как "xjc", чтобы делать то, что вы просите, между определениями XML и POJO), нет полностью языка схем функций. Существует JSON Schema, но у нее очень мало поддержки фактических определений типов (основное внимание уделяется структурам JSON), поэтому было бы сложно создавать классы Java. Но, вероятно, все еще возможно, особенно. если некоторые соглашения об именах были определены и использованы для поддержки генерации.

Однако: это то, что довольно часто запрашивалось (в списках рассылки JSON-инструментальных проектов я следую), поэтому я думаю, что кто-то напишет такой инструмент в ближайшем будущем.

Поэтому я не думаю, что это плохая идея сама по себе (также: это не очень хорошая идея для всех случаев использования, зависит от того, что вы хотите делать).

Ответ 9

У меня была такая же проблема, поэтому я решил начать писать небольшой инструмент, чтобы помочь мне в этом. Я собираюсь поделиться и открыть его источник.

https://github.com/BrunoAlexandreMendesMartins/CleverModels

Он поддерживает JAVA, С# и Objective-c от JSON.

Не стесняйтесь вносить свой вклад!

Ответ 10

Я создал gythub-проект Json2Java, который делает это. https://github.com/inder123/json2java

Json2Java предоставляет такие настройки, как переименование полей и создание иерархий наследования.

Я использовал инструмент для создания некоторых относительно сложных API:

API Gracenote TMS: https://github.com/inder123/gracenote-java-api

API геокодирования Google Maps: https://github.com/inder123/geocoding

Ответ 11

Чтобы добавить к сообщению @japher. Если вы не особенно привязаны к JSON, Буферы протоколов стоит проверить.

Ответ 12

Вы также можете попробовать библиотеку GSON. Его довольно мощный он может создавать JSON из коллекций, пользовательских объектов и работает также наоборот. Он выпущен под Apache License 2.0, поэтому вы можете использовать его также на коммерческой основе.

http://code.google.com/p/google-gson/

Ответ 13

Позвольте мне показать вам, как разработать инструмент. Вы можете сделать это:

  • функция javascript пользователя Json.parse(), make string like-json trans to js object
  • затем используйте этот объект, чтобы разделить javabean-формат.
  • что-то, вы shoud care. (1) отображение типа значения, например, как определить строку, тип даты. (2) loweser_case to camelCase

Я разработал инструмент для решения проблемы. Он хорошо разработан и быстрее. получите код из моего github.

наслаждайтесь этим, я разместил его на веб-сервере.

Я пробую верхнюю часть ответа на предложение. Один веб-сайт не может открыть. Один медленнее, чем мой инструмент. Надеюсь, вам понравится мой инструмент.

Ответ 14

Попробуйте мое решение

http://htmlpreview.github.io/?https://raw.githubusercontent.com/foobnix/android-universal-utils/master/json/generator.html

{
    "auctionHouse": "sample string 1",
    "bidDate": "2014-05-30T08:20:38.5426521-04:00 ",
    "bidPrice": 3,
    "bidPrice1": 3.1,
    "isYear":true
}

Результат Java Class

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