首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Hibernate vladmihalcea jsonb类型:是否可以将默认JSON字段的顺序更改为不同的字段?

Hibernate vladmihalcea jsonb类型:是否可以将默认JSON字段的顺序更改为不同的字段?
EN

Stack Overflow用户
提问于 2021-09-25 23:56:27
回答 1查看 695关注 0票数 0

我有一个带有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}

-源模型类

代码语言:javascript
运行
复制
@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;
}

-实体类

代码语言:javascript
运行
复制
@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;

代码语言:javascript
运行
复制
<dependency>
        <groupId>com.vladmihalcea</groupId>
        <artifactId>hibernate-types-52</artifactId>
        <version>${hibernate-types-52.version}</version>
    </dependency>
EN

回答 1

Stack Overflow用户

发布于 2021-09-26 01:17:59

它的不应该是属性的顺序是什么。JSON规范清楚地声明JSON对象属性是无序。如果您的代码在序列化中对属性的(未指定的)顺序有意义,那么它就误用了JSON。

因此,最正确的解决方案是更改应用程序,使其不依赖于JSON属性顺序。

(在您的示例中,我无法想象为什么属性的顺序具有语义意义。因此,我的猜测是,您正在将JSON呈现为其他形式(例如HTML或CSV),其中订单对人们有一定的意义。或者软件。在这种情况下,最好的解决方案是在呈现点指定所需的顺序。)

对于一些JSON解析器,有一些解决方案是可行的。例如,一些解析器允许您提供自己的Map实现。因此,如果您在序列化和反序列化时使用了LinkedHashMap,并且您最初以特定的顺序添加了属性,则应该通过序列化和反序列化来保留属性的插入顺序。

但是,我不知道是否有一个与"jsonb“序列化一起工作的恶意解决方案。因此,您可能需要“手工”进行序列化,而不是使用@JsonSerialize

如果您之所以这样做,是因为您被告知要实现一些为JSON属性规定特定顺序的需求,那么需求规范就被打破了。你应该向后推。指出他们要求的不是JSON。如果他们需要用JSON订购东西..。他们应该指定一个JSON数组。

参考文献:

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69330867

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档