gson实体转json时当字段值为空时,json串中就不存在该属于,请问如何在值为空的时候也保留该字符串

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了gson实体转json时当字段值为空时,json串中就不存在该属于,请问如何在值为空的时候也保留该字符串相关的知识,希望对你有一定的参考价值。

如name不为空时,json串可能为"name","test",当name为空时,json串为"name","",或者"name",null,现在的情况是为空时,就不会有name这个key

用这种方式就可以了:

Gson g = new GsonBuilder().serializeNulls().create();

这里面需要注意几点:

1、内部嵌套的类必须是static的,要不然解析会出错;

2、类里面的属性名必须跟Json字段里面的Key是一模一样的;

3、内部嵌套的用[]括起来的部分是一个List,所以定义为 public List b,而只用嵌套的就定义为 public C c

Gson gson = new Gson();

java.lang.reflect.Type type = new TypeToken() .getType();

JsonBean jsonBean = gson.fromJson(json, type);

然后想拿数据就很简单啦,直接在jsonBean里面取就可以了!

参考技术A 用这种方式就可以了:
Gson g = new GsonBuilder().serializeNulls().create();
亲测通过,楼主记得给分哦!本回答被提问者采纳

InstantiationException:在 Kotlin 中使实体字段不可为空时,没有实体的默认构造函数

【中文标题】InstantiationException:在 Kotlin 中使实体字段不可为空时,没有实体的默认构造函数【英文标题】:InstantiationException: No default constructor for entity when making an Entity field NOT nullable in Kotlin 【发布时间】:2020-05-03 07:46:24 【问题描述】:

我有一个项目实体(如下所示)。当我尝试改变时

var fullName: String?= null

到:

var fullName: String,

我突然从 Hibernate 得到一个 InstantiationException:

org.hibernate.InstantiationException: No default constructor for entity:

在此之前没有任何问题。可能出了什么问题?这是实体类:

package no.inmeta.ris.project.model.entity

import org.hibernate.annotations.GenericGenerator
import java.util.*
import javax.persistence.*

@Entity
data class Project (

    @Id
    @GeneratedValue(generator = "uuid2")
    @GenericGenerator(name = "uuid2", strategy = "uuid2")
    @Column(columnDefinition = "BINARY(16)")
    var id : UUID? = null,

    var fullName: String,

    var shortName: String? = null,

    var prevRefId: String? = null,

    var startDate: Date? = null,

    var endDate: Date?  = null,

    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(name = "Associated_Projects",
        joinColumns = [JoinColumn(name = "associated_project")],
        inverseJoinColumns = [JoinColumn(name = "second_associated_project") ])
    var associatedProjects: List<Project?> = mutableListOf(),

    var shortDescription: String? = null,

    var summary: String?  = null,

    var url: String? = null,

    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(name = "Project_Types",
        joinColumns = [JoinColumn(name = "project_id")],
        inverseJoinColumns = [JoinColumn(name = "type_id") ])
    var type: List<Type?> = mutableListOf()
    )

【问题讨论】:

嘿@Nora,我认为缺少默认构造函数。你添加了吗? 【参考方案1】:

为 fullName 参数提供默认值或保持为空。

在您的代码中,它没有默认值,因此在生成的 Java 字节码 Project 类中不会有没有参数的构造函数 - 它至少需要 1 个参数来初始化 fullName 字段。

【讨论】:

我正在创建一个 API 并试图避免任何默认值。同时我不希望 fullName 为空,因为它是必填字段 Hibernate 需要一个默认构造函数。默认构造函数是没有参数的构造函数。如果希望 Kotlin 为数据类生成默认构造函数,则必须为其主构造函数中声明的每个属性设置默认参数。 看这里的答案***.com/questions/37873995/…【参考方案2】:

您应该提供一个默认构造函数。如果您不想在此类之外公开它,您可以将其设为私有:

package no.inmeta.ris.project.model.entity

import org.hibernate.annotations.GenericGenerator
import java.util.*
import javax.persistence.*

@Entity
data class Project (

    @Id
    @GeneratedValue(generator = "uuid2")
    @GenericGenerator(name = "uuid2", strategy = "uuid2")
    @Column(columnDefinition = "BINARY(16)")
    var id : UUID? = null,

    var fullName: String,

    var shortName: String? = null,

    var prevRefId: String? = null,

    var startDate: Date? = null,

    var endDate: Date?  = null,

    private constructor()

    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(name = "Associated_Projects",
        joinColumns = [JoinColumn(name = "associated_project")],
        inverseJoinColumns = [JoinColumn(name = "second_associated_project") ])
    var associatedProjects: List<Project?> = mutableListOf(),

    var shortDescription: String? = null,

    var summary: String?  = null,

    var url: String? = null,

    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(name = "Project_Types",
        joinColumns = [JoinColumn(name = "project_id")],
        inverseJoinColumns = [JoinColumn(name = "type_id") ])
    var type: List<Type?> = mutableListOf()
    )

【讨论】:

以上是关于gson实体转json时当字段值为空时,json串中就不存在该属于,请问如何在值为空的时候也保留该字符串的主要内容,如果未能解决你的问题,请参考以下文章

Android探究之Gson@SerializedName

google的gson和阿里巴巴的fastjson,为啥把有关联实体转json就会报错啊,说缺少字段啥乱七八糟的。

java字段值为null,转json后不存在该字段对应的key

通过Gson过滤多余的字段

Gson 解析 json串过长就报错,解析10条没问题,解析20条就错

记录--Gsonjson转实体类类转json