当前位置: 首页 > 知识库问答 >
问题:

如何使用Java DynamoDBMapper类保存任意结构的文档

甄德寿
2023-03-14

我正在使用Amazon的DynamoDBMapperJava类将数据保存到DynamoDB表中。该代码需要以多种不同的方式对数据进行结构化处理,因此我不想编写特定于结构的代码。出于这个原因,我将代码存储为Java的JSON对象——基本上是荣耀的HashMaps。

我想将这些JSON对象作为Dynamo相对较新的JSON文档类型存储到Dynamo中。

DynamoDBMapper API的工作方式基本上是编写一个Java类(通常是一个POJO),然后添加一些注释,然后将该类的对象传递到DynamoDBMapper,这样它就可以使用Java类的结构将项放入数据库。这适用于我正在做的许多方面,但我不希望这些类包含任意结构的JSON文档。这就是使用DynamoDBMapper存储JSON文档的方式,正如您所看到的,它不允许文档的结构是任意的。

我意识到我可以使用Dynamo的putItem()将JSON作为字符串传递到Item对象中——我只是想在改变方法之前看看我想用DynamoDBMapper做的事情是否可行。

共有3个答案

柳星晖
2023-03-14

我也遇到了同样的问题,我自己去序列化和反序列化对象到json字符串,然后把它们存储为字符串。DynamoDB的整个文档概念是IMHO只是一个美化的对象序列化器。只有当你需要在Dynamodb操作(例如。扫描,投影)中访问对象内部的属性时,使用json文档类型才有意义。如果我们的数据对Dynamodb不透明,你最好使用字符串。

慎旭尧
2023-03-14

这是我如何想出如何在DynamoDB中存储任意地图对象的答案。这对于归档已解封送到外部对象的REST应用编程接口响应非常有用。我个人正在使用它来归档来自PayPal支付应用编程接口的REST响应。我不在乎他们在REST应用编程接口中使用什么变量或他们的POJO/bean的结构。我只想确保我保存了所有东西。

@DynamoDBTable(tableName = "PaymentResponse")
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY)
@JsonSubTypes({
    @JsonSubTypes.Type(value = PayPalPaymentResponse.class, name = "PayPalPaymentResponse"),
    @JsonSubTypes.Type(value = BatchPayPalPaymentResponse.class, name = "BatchPayPalPaymentResponse")}
    )
public abstract class PaymentResponse {

    // store any arbitrary REST resrponse data in map form so we don't have to worry about the 
    // structure or the actual response itself
    protected Map<String, String> paymentResponseData = Maps.newHashMap();

    public PaymentResponse(PaymentResponseType paymentResponseType) {
        this.paymentResponseType = paymentResponseType;
    }

    public Map<String, String> getPaymentResponseData() { return paymentResponseData; }

    public void setPaymentResponseData(Map<String, String> paymentResponseData) { this.paymentResponseData = paymentResponseData; }

    @Override
    public String toString() {
        return Arrays.toString(paymentResponseData.entrySet().toArray());
    }
}

public class ConverterUtils {

      public static BatchPayPalPaymentResponse getBatchPayPalPaymentResponse(PayoutBatch payoutBatch) throws IOException {
        //read in the PayoutBatch response data and convert it first to a JSON string and then convert the
        //JSON string into a Map<String, String>
        Map<String, String> responseData = objectMapper.readValue(objectMapper.writeValueAsString(payoutBatch), new TypeReference<Map<String, String>>() {});
        BatchPayPalPaymentResponse batchPayPalPaymentResponse = new BatchPayPalPaymentResponse(responseData);
        return batchPayPalPaymentResponse;
    }

    public static PayPalPaymentResponse getSinglePayPalPaymentResponse(PayoutItemDetails payoutItemDetails) throws IOException {
        //read in the paypal PayoutItemDetails response data and convert it first to a JSON string and then convert the
        //JSON string into a Map<String, String>
        Map<String, String> responseData = objectMapper.readValue(objectMapper.writeValueAsString(payoutItemDetails), new TypeReference<Map<String, String>>() {});
        PayPalPaymentResponse payPalPaymentResponse = new PayPalPaymentResponse(responseData);
        return payPalPaymentResponse;

    }
}

public class BatchPayPalPaymentResponse extends PaymentResponse {
    public BatchPayPalPaymentResponse(Map<String, String> responseData) {
        super(responseData);
    }
    ....
    ....
    ....
}

public class PayPalPaymentResponse extends PaymentResponse {
    public PayPalPaymentResponse(Map<String, String> responseData) {
        super(responseData);
    }
    ....
    ....
    ....
}

现在,您可以调用mapper.save(instanceOfPaymentACK)。请注意,我的代码还包括如何使用Jackson解析器来挑选和选择要散集的支付响应的子类。这是因为我在将类放入数据库之前使用DynamoDBTypeConver将类列表为字符串。

最后,为了完整性,我将加入我的转换器,所以希望这一切都有意义。

public class PaymentResponseConverter implements DynamoDBTypeConverter<String, PaymentResponse> {

    private static final ObjectMapper objectMapper = new ObjectMapper();
    static {
        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
    }

    @Override
    public String convert(PaymentResponse object) {
        try {
            return objectMapper.writeValueAsString(object);
        } catch (JsonProcessingException e) {
            throw new IllegalArgumentException(String.format("Received invalid instance of PaymentResponse and cannot marshal it to a string (%s)", e.getMessage()));
        }
    }

    @Override
    public PaymentResponse unconvert(String object) {
        try {
            return objectMapper.readValue(object, PaymentResponse.class);
        } catch (IOException e) {
            throw new IllegalArgumentException(String.format("Unable to convert JSON to instance of PaymentResponse. This is a fatal error. (%s)", e.getMessage()));
        }
    }
}
呼延河
2023-03-14

您可以尝试使用DynamoDB Java文档SDK而不是对象映射器。这允许您使用Item类中的fromJSON和toJSON方法序列化和反序列化JSON字符串。退房http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/JavaDocumentAPIItemCRUD.html.

 类似资料:
  • 问题内容: 通过从继承可以很容易地将Realm与类一起使用。但是我如何将包含几个字段的a保存到Swift中呢?例如 我知道文档中明确支持的类型。但是也许有一个不错的解决方法,或者甚至更好-来自领域的人可以写有关结构的未来计划。 问题答案: 我建议您使用协议,以实现所需的功能。 1)创建您的结构 2)创建您的领域对象 3)使用协议将我们的结构转换为Realm对象 4)使您的结构持久 有了这些工具,我

  • 我对rust是完全陌生的,我正试图找出如何从URLendpoint反序列化任意JSON结构。 reqwest自述文件中的相应示例如下: 因此,在本例中,目标结构--即以字符串作为键、以字符串作为值的HashMap对象--显然是已知的。 但是,如果我不知道在请求endpoint上接收到的结构是什么样子呢?

  • 我有一个函数: 其中参数通常是: 其中键,可以是任何值,但值总是(必须是)类型其中,都是函数。 如何使用JSDoc在我的工厂函数中为事件参数记录这个结构? 我能想到的唯一解决方案是制作一个数组,然后我可以像这样使用typedef: 但是我真的想保留原来的结构。 是否可以在我的原始结构中记录此类型定义? 我主要关心的是它在VSCode中的工作,VSCode将这些类型定义从JSDoc中提升出来。

  • 向量具有良好的缓存效率(索引接近的元素在内存中放置得很近),但对于任意位置的插入效率低下。列表在任意位置插入了(只要您知道该位置的地址),但它们具有可怕的缓存效率(元素在堆中随机分布)。 有没有在索引中插入了< code>O(1)的数据结构,可以将具有近索引的元素放在内存的近位置?

  • 我是python新手,我正在尝试读取文本文件并从文本中收集一些信息。例如,如果文本包含“1.Andrew是XYZ大学的学生,毕业于2020年。”对于上述文本,我要求我的答案是“学生1:Andrew,毕业年份:2020,大学:XYZ”。同样,我需要验证n个学生,并存储n个学生的结果。我只知道这里的基本知识,在这里我可以以不同的格式打开文件,如读、写。。。因此,我对如何进行下一步感到困惑。 任何帮助都

  • 问题内容: 我正在尝试使用gson将返回的JSON转换为某种数据结构,以便提取有用的数据。 例如: http://search.twitter.com/search.json?q=test&rpp=1 返回值: 最终,我希望能够输出带有发件人名称和推文日期/时间的推文列表。 我已经阅读了gson文档,但是说实话,这让我头疼不已-我那里有很多新概念。 我是否需要定义一个完全映射到JSON结构的类,以