2016-11-25 9 views
1

Мой проект использует JAXB, чтобы превратить XSD (XML-схему) в POJO и cxf, чтобы превратить заполненные классы в JSON. Есть ли инструмент, который может принять схему и создать образец документа JSON для меня? Идеально командной строки или 5 строк Java-фрагмента.Что такое быстрый и простой способ создания образца документа JSON из XML-схемы XSD (с использованием JAXB)?

Функционально, я хочу что-то похожее на то, что SoapUI делает, когда вы его передаете WSDL (то есть, между прочим, генерируете образец запроса из схемы и предварительно заполняете все строки вопросительным знаком ?).

В основном я хочу, чтобы проверить, не изменили ли изменения схемы XSD структуру JSON, которую я хочу (поэтому я забочусь о структуре и типах, а не о значениях).

NB: Я не хочу создавать схему JSON, и я не могу использовать схему JSON вместо XSD.

ответ

1

Вы можете создать json непосредственно из классов, созданных с помощью jaxb.

Jaxb создает классы pojo.

Любая библиотека json может создавать json из экземпляра pojo.

Вот шаги:

  • Создать ваш XSD
  • Создание классов из XSD с помощью инструмента xjc
  • Создание экземпляра классов
  • передать экземпляр в библиотеку Pojo и создать String

Приведен пример с faster jackson:

ObjectMapper mapper = new ObjectMapper(); 

// PojoClass is the class created with xjc from your xsd 
PojoClass pojoInstance = new PojoClass(); 

// Populate pojoInstance as needed 

String jsonString = mapper.writeValueAsString(pojoInstance); 
System.out.println(jsonString); // Print the pojoInstance as json string 

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

public class RandomObjectFiller { 

    private Random random = new Random(); 

    public <T> T createAndFill(Class<T> clazz) throws Exception { 
     T instance = clazz.newInstance(); 
     for(Field field: clazz.getDeclaredFields()) { 
      field.setAccessible(true); 
      Object value = getRandomValueForField(field); 
      field.set(instance, value); 
     } 
     return instance; 
    } 

    private Object getRandomValueForField(Field field) throws Exception { 
     Class<?> type = field.getType(); 


     if(type.equals(Integer.TYPE) || type.equals(Integer.class)) { 
      return random.nextInt(); 
     } else if(type.equals(Long.TYPE) || type.equals(Long.class)) { 
      return random.nextLong(); 
     } else if(type.equals(Double.TYPE) || type.equals(Double.class)) { 
      return random.nextDouble(); 
     } else if(type.equals(Float.TYPE) || type.equals(Float.class)) { 
      return random.nextFloat(); 
     } else if(type.equals(String.class)) { 
      return UUID.randomUUID().toString(); 
     } 
     return createAndFill(type); 
    } 
} 

Предыдущий пример использования этого класса является следующий код:

ObjectMapper mapper = new ObjectMapper(); 

RandomObjectFiller randomObjectFiller = new RandomObjectFiller(); 

// PojoClass is the class created with xjc from your xsd 
PojoClass pojoInstance = randomObjectFiller.createAndFill(PojoClass.class); 

String jsonString = mapper.writeValueAsString(pojoInstance); 
System.out.println(jsonString); // Print the pojoInstance as json string 
+0

К сожалению, это требует от меня, чтобы заполнить POJO, вместо того, чтобы просто используя/случайные значения по умолчанию ... (Я хочу, чтобы оптимизировать for laziness ... ;-) – Christian

+0

@Christian, поэтому ваша проблема не превращает объекты в json, но как заполнить объект случайными значениями? –

+0

Нет, это и то и другое. Ваш ответ ответил на мой вопрос о 50% ... ;-) – Christian