当前位置: 首页 > 面试题库 >

Jackson ObjectMapper-指定对象属性的序列化顺序

穆鸿卓
2023-03-14
问题内容

我正在实现RESTful Web服务,其中用户必须与请求一起发送签名的验证令牌,以便可以确保请求不会被中间人篡改。我当前的实现如下。

验证令牌是一个VerifData对象,它序列化为String,然后进行哈希处理和加密。

class VerifData {
    int prop1;
    int prop2;
}

在我的服务中,我将要序列化的数据放入VerifData的实例中,然后使用Jackson
ObjectMapper对其进行序列化,并与验证令牌一起传递给验证引擎。

VerfiData verifData = new VerifData(12345, 67890);
ObjectMapper mapper = new ObjectMapper();
String verifCodeGenerated = mapper.writeValueAsString(verifData);

但是似乎每次启动应用程序容器时,ObjectMapper映射到字符串的属性的顺序都会改变。

例如:一次

{"prop1":12345,"prop2":67890}

再过一次

{"prop2":67890,"prop1":12345}

因此,如果客户端将VerifData实例序列化为第一个String,即使它是正确的,也有50%的机会失败。

有办法解决这个问题吗?是否可以指定要按ObjectMapper映射的属性的顺序(如升序)?还是有其他方法可以最好地实施此验证步骤。客户端和服务器实现都是我开发的。我使用Java
Security API进行签名和验证。


问题答案:

从Jackson注释文档中:

// ensure that "id" and "name" are output before other properties
@JsonPropertyOrder({ "id", "name" })

// order any properties that don't have explicit setting using alphabetic order
@JsonPropertyOrder(alphabetic=true)


 类似资料:
  • 我正在实现一个RESTful web服务,其中用户必须在请求的同时发送一个签名的验证令牌,这样我就可以确保请求没有被中间人篡改。我当前的实现如下所示。 验证令牌是一个VerifData对象,序列化为字符串,然后进行散列和加密。 有办法绕过这件事吗?我可以指定ObjectMapper要映射的属性的顺序吗(像按升序)?或者是否有任何其他方法可以最好地实现此验证步骤。客户端和服务器实现都是我开发的。我使

  • 我们有一张350列的桌子。pojo类被生成,getter命令被打乱。试图使用jackson提供的csvmapper,但它会根据getter顺序生成csv@JsonPropertyOrder也不适合使用,因为有很多列。我们用xml维护列顺序,并且可以在运行时生成字段顺序数组。我们可以在运行时重写以提供属性排序的字段名数组吗?我们可以使用注释内省器进行自定义吗?

  • 问题内容: 我想按对象的指定属性对对象列表进行排序,并希望选择用于排序的属性。例: 这个想法很简单: 我将要排序的所有值都放入一个数组中,并创建了一个映射,将这些值映射回它们的对象。对这个数组进行排序后,我将映射到这些值的对象按相同的顺序放入一个新数组中,然后按这些值对它们进行排序。这些值只是使用Object类型创建的,因此我可以按多种类型(不仅仅是示例中的Strings)进行排序。 除非您有两个

  • 我需要反序列化以下json: 将它的< code>id属性设置为< code>foo_id json属性。 我需要在自定义反序列化程序中执行此操作。实现这一点最简单的方法是什么? 我想以某种方式将json“转换”为 然后将此委托给杰克逊。 在本例中,对象的类型为Foo,但其他对象可能不属于此类。另外,在本例中,json是一个数字,但如果它也是一个字符串,我希望支持。所以,我需要一种通用的方法来做到

  • 我想优化要在线发送的json数据。我的代码中有三个模型。这些是客户、发票和明细。 客户类别 发票类 特定类别 我的测试代码: 这里我想要的是通过序列化发票来避免冗余,以便生成的json紧凑。这应该通过只发送invoiceId属性值而不是整个Invoice对象json来实现。 测试代码打印的内容: 我希望它打印的内容: 数据是用于生成getter和setter的lombok注释。 我试图添加注释到发

  • 我对班级结构有如下建议: @JsonTypeInfo(use=JsonTypeInfo.Id.NAME,include=JsonTypeInfo.As.PROPERTY,PROPERTY=“type”) 上面的类被序列化为json元素数组,但是当我反序列化它们时,我想要如下结构: 公共阶层结构{ 是否可以将testA、testB和testC类型的元素数组转换为FlatStructure类的属性?