将json数据映射到相应的类

时间:2018-04-11 08:40:40

标签: java json apache-camel gson jms

我有一个String格式的JSON数据。这个JSON数据来自JMS队列。  例如: -

String msg=" {"id":"4","item":"GOT","description":"hello"}";

我正在使用Gson库

将此JSON字符串转换为Corresponding类对象
Gson g = new Gson();   
BooksTable b1 = g.fromJson(msg, BooksTable.class); //BooksTable is a POJO class with getter setters
addBook(b1);   //used to insert object into the database Books table

现在问题是这个json可以是books表,也可以是具有格式为json的事务表

String msg=" {"id":"2","name":"deposit","purpose":"savings"}";

我想基于JSON字符串动态地将对象映射到相应的类。

例如:如果Transaction JSON将其发送到Transaction表,则Books JSON会将其发送到Books表。

我该怎么做?如果apache camel可以这样做,请告诉我如何接近? 任何方法都将不胜感激。

3 个答案:

答案 0 :(得分:2)

首先使用JsonParser解析JSON,以便检查它,然后使用Gson解组到适当的对象类型。

public class Test {
    public static void main(String[] args) {
        process("{\"id\":\"4\",\"item\":\"GOT\",\"description\":\"hello\"}");
        process("{\"id\":\"2\",\"name\":\"deposit\",\"purpose\":\"savings\"}");
    }
    private static void process(String json) {
        JsonObject object = new JsonParser().parse(json).getAsJsonObject();
        if (object.has("item")) {
            Book book = new Gson().fromJson(object, Book.class);
            System.out.println(book);
        } else if (object.has("name")) {
            Transaction transaction = new Gson().fromJson(object, Transaction.class);
            System.out.println(transaction);
        } else {
            System.out.println("Unknown JSON: " + json);
        }
    }
}
class Book {
    private int id;
    private String item;
    private String description;
    @Override
    public String toString() {
        return "Book[id=" + this.id +
                  ", item=" + this.item +
                  ", description=" + this.description + "]";
    }
}
class Transaction {
    private int id;
    private String name;
    private String purpose;
    @Override
    public String toString() {
        return "Transaction[id=" + this.id +
                         ", name=" + this.name +
                         ", purpose=" + this.purpose + "]";
    }
}

输出

Book[id=4, item=GOT, description=hello]
Transaction[id=2, name=deposit, purpose=savings]

答案 1 :(得分:1)

您可以使用camel-jsonpath检查JSON字符串是否包含某个字段:

<choice>
    <when>
        <jsonpath suppressExceptions="true">$.item</jsonpath>
        <!-- Unmarshal to Book -->
    </when>
    <when>
        <jsonpath suppressExceptions="true">$.name</jsonpath>
        <!-- Unmarshal to Transaction -->
    </when>
</choice>

答案 2 :(得分:0)

您可以尝试将此扩展程序检出驼峰 - JSON Schema Validator Component。它应该与camel中的原始验证器相同,但它允许您根据模式验证邮件正文。