从XSD XML模式(使用JAXB)生成示例JSON文档的快速而简单的方法是什么?

时间:2016-11-25 16:12:53

标签: java json xml xsd jaxb

我的项目是使用JAXB将XSD(XML模式)转换为POJO,使用cxf将填充的类转换为JSON。是否有可以采用模式的工具,并为我生成示例JSON文档?理想情况下,命令行或5行Java代码段。

功能方面,我想要一些类似于SoapUI在您提供WSDL时所做的事情(即,除其他外,从模式生成示例请求并使用?问号预先填充所有字符串)

我基本上想要一种快速方法来检查XSD架构更改是否产生了我想要的JSON结构(所以我关心结构和类型,而不是关于值)。

注意:我不想创建JSON模式,也不能使用JSON模式而不是XSD。

1 个答案:

答案 0 :(得分:1)

您可以直接从使用jaxb创建的类创建json。

Jaxb创建pojo类。

任何json库都可以从pojo实例创建json。

以下是步骤:

  • 创建您的xsd
  • 使用工具xjc
  • 从xsd创建类
  • 创建类的实例
  • 将实例传递给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