嵌套的json结构

时间:2017-07-11 00:57:17

标签: java json serialization amazon-dynamodb

我想创建一个具有以下功能的dynamodb

  1. PK:orderId
  2. RK:date
  3. 已发货:Y|N
  4. 详情:<nested json structure>
  5. 第4点是我真正感到困惑的一点。如果我将details字段保留为字符串并尝试将json存储为字符串,则AWS 转义 "字符,即{"onlineStore" : "283"}变为{{1 }}

    使用{\"onlineStore\": \"283\"}作为字符串映射从dynamodb中正确检索此get,但如果我必须使用jackson将其转换为pojo,我必须处理那些details

    作为替代方案,我认为我可以创建\ POJO ,即

    details

    通过上述实现,我得到public class OrderDetail{ private int onlineStore; // rest of the JSON properties @JsonCreator public OrderDetail (@JsonProperty("onlineStore") int onlineStore, ...){ this.onlineStore = onlineStore; } } 的错误。

    DynamoDBMappingException: Couldn't convert attribte类型是我的JSON REST响应之间使用的常见类型,因此我想避免在此处放置OrderDetail特定注释。

    现在的问题是实施它的正确方法

1 个答案:

答案 0 :(得分:0)

如果您使用DynamoDB Mapper class执行CRUD操作,则可以使用注释@DynamoDBTypeConvertedJson保存订单详细信息。

DynamoDBTypeConvertedJson - 查看此链接了解更多详情

DynamoDBMapper类: -

  

AWS SDK for Java提供了一个DynamoDBMapper类,允许您使用   将客户端类映射到DynamoDB表。使用   DynamoDBMapper,您定义一个项目之间的关系   DynamoDB表及其代码中的相应对象实例。   DynamoDBMapper类使您可以访问表,执行   各种创建,读取,更新和删除(CRUD)操作,并执行   查询。

示例实施: -

@DynamoDBTable(tableName = "Order")
public class Order implements Serializable {

    private static final long serialVersionUID = -3534650012619938612L;

    private String orderId; 

    private OrderDetail orderDetail;

    @DynamoDBHashKey(attributeName = "orderId")
    @DynamoDBAutoGeneratedKey
    public String getOrderId() {
        return orderId;
    }

    public void setOrderId(String orderId) {
        this.orderId = orderId;
    }

    @DynamoDBTypeConvertedJson
    public OrderDetail getOrderDetail() {
        return orderDetail;
    }

    public void setOrderDetail(OrderDetail orderDetail) {
        this.orderDetail = orderDetail;
    }

}

public class OrderDetail implements Serializable {

    private static final long serialVersionUID = 7312390212027563305L;
    private Integer onlineStore;

    public Integer getOnlineStore() {
        return onlineStore;
    }

    public void setOnlineStore(Integer onlineStore) {
        this.onlineStore = onlineStore;
    }

    @Override
    public String toString() {
        return "OrderDetail [onlineStore=" + onlineStore + "]";
    }

}

public Order loadOrder(String orderId) {

    DynamoDBMapper dynamoDBMapper = new DynamoDBMapper(dynamoDBClient);

    Order order = dynamoDBMapper.load(Order.class, orderId,
            new DynamoDBMapperConfig(DynamoDBMapperConfig.ConsistentReads.CONSISTENT));

    System.out.println("Order : " + order.toString());
    System.out.println("Order Id : " + order.getOrderId());
    System.out.println("Order Detail : " + order.getOrderDetail());
    System.out.println("Online store : " + order.getOrderDetail().getOnlineStore());

    return order;

}

<强>输出: -

Order Id : 0beced28-f1de-4c44-8094-6de687d25e97
Order Detail : OrderDetail [onlineStore=1]
Online store : 1

DDB中的数据: -

正如您所提到的,订单明细将与转义字符一起存储。但是,当您使用DynamoDB映射器获取数据时,它将以反序列化的形式(即作为POJO对象)。

enter image description here