我有一个带有Hibernate的Spring项目。对于json字段,使用诸如@Type(type = "jsonb")之类的注释,并定义Hibernate ORM额外类型:"com.vladmihalcea,hibernate-type-52“
它的工作是正确的。但是,是否可以将默认字段的顺序更改为不同的字段?比如“@JsonPropertyOrder”。(这个注释在这里不起作用)。
例如,下面的代码将jsonb写入PostgreSQL:
结果- birthDate全名:{“lastName”:“some lastName”,“birthDate”:“01.01.1985”,“firstName”:“some firstName”,“middleName”:“some”,“personDocument”:null}
我需要:{“lastName”:“一些lastName”,“firstName”:“一些firstName”,“middleName”:“一些中间名”,“birthDate”:“01.01.1985”,“personDocument”:null}
-源模型类
@JsonPropertyOrder( //This annotation not work :(
{“lastName”, “firstName”, “middleName”, “birthDate”, “personDocument”})
public class PersonInfo implements Serializable {
private static final long serialVersionUID = 8604200400882367977L;
@JsonSerialize(using = SnilsSerializer.class)
private String lastName;
private String firstName;
private String middleName;
private PersonInfoDocument personDocument;
@JsonSerialize(using = LocalDateSerializer.class)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd.MM.yyyy")
private LocalDate birthDate;
}
-实体类
@Data
@Builder
@Entity
@Table(name = "CO_PERSONS")
@TypeDef(name = "jsonb", typeClass = JsonBinaryType.class)
@ToString(exclude = {"co", "personInfo"})
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor
@AllArgsConstructor
public class Person extends AuditableModel<Long> {
private static final long serialVersionUID = 3903875373255655212L;
@Id
@SequenceGenerator(name = "co_persons_cp_id_seq",
sequenceName = "co_persons_cp_id_seq",
allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE,
generator = "co_persons_cp_id_seq")
@Column(name = "cp_id", updatable = false)
private Long id;
@Type(type = "jsonb")
@Column(name = "cp_individual_json", columnDefinition = "jsonb")
private PersonInfo personInfo;
<dependency>
<groupId>com.vladmihalcea</groupId>
<artifactId>hibernate-types-52</artifactId>
<version>${hibernate-types-52.version}</version>
</dependency>
发布于 2021-09-26 01:17:59
它的不应该是属性的顺序是什么。JSON规范清楚地声明JSON对象属性是无序。如果您的代码在序列化中对属性的(未指定的)顺序有意义,那么它就误用了JSON。
因此,最正确的解决方案是更改应用程序,使其不依赖于JSON属性顺序。
(在您的示例中,我无法想象为什么属性的顺序具有语义意义。因此,我的猜测是,您正在将JSON呈现为其他形式(例如HTML或CSV),其中订单对人们有一定的意义。或者软件。在这种情况下,最好的解决方案是在呈现点指定所需的顺序。)
对于一些JSON解析器,有一些解决方案是可行的。例如,一些解析器允许您提供自己的Map
实现。因此,如果您在序列化和反序列化时使用了LinkedHashMap
,并且您最初以特定的顺序添加了属性,则应该通过序列化和反序列化来保留属性的插入顺序。
但是,我不知道是否有一个与"jsonb“序列化一起工作的恶意解决方案。因此,您可能需要“手工”进行序列化,而不是使用@JsonSerialize
。
如果您之所以这样做,是因为您被告知要实现一些为JSON属性规定特定顺序的需求,那么需求规范就被打破了。你应该向后推。指出他们要求的不是JSON。如果他们需要用JSON订购东西..。他们应该指定一个JSON数组。
参考文献:
https://stackoverflow.com/questions/69330867
复制相似问题