首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

将枚举的@JsonProperty值序列化为@RequestParam

在Java中,@JsonProperty@RequestParam是两个常用的注解,分别用于不同的场景。@JsonProperty主要用于JSON序列化和反序列化,而@RequestParam主要用于处理HTTP请求中的查询参数。

基础概念

  1. @JsonProperty:
    • 用于指定JSON序列化和反序列化时的字段名称。
    • 通常与Jackson库一起使用。
  • @RequestParam:
    • 用于Spring MVC中,将HTTP请求中的查询参数绑定到方法参数上。
    • 主要用于处理GET请求中的查询字符串。

类型与应用场景

  • 类型:
    • @JsonProperty可以应用于字段、getter和setter方法。
    • @RequestParam通常应用于控制器方法的参数。
  • 应用场景:
    • 当你需要将Java对象序列化为JSON或从JSON反序列化为Java对象时,使用@JsonProperty
    • 当你需要从HTTP请求中获取查询参数并将其绑定到控制器方法的参数时,使用@RequestParam

示例代码

假设我们有一个枚举类型和一个控制器方法,我们希望将枚举的@JsonProperty值序列化为@RequestParam

代码语言:txt
复制
import com.fasterxml.jackson.annotation.JsonProperty;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class EnumController {

    // 定义一个枚举类型
    public enum Status {
        @JsonProperty("active")
        ACTIVE,

        @JsonProperty("inactive")
        INACTIVE
    }

    // 控制器方法,接收一个枚举类型的查询参数
    @GetMapping("/status")
    public String getStatus(@RequestParam Status status) {
        return "Status: " + status;
    }
}

遇到的问题及解决方法

问题:枚举的@JsonProperty值无法正确序列化为@RequestParam

原因:

  • 默认情况下,Spring MVC可能无法正确解析带有@JsonProperty注解的枚举值。

解决方法:

  • 使用@JsonCreator@JsonValue注解来明确指定枚举的序列化和反序列化方式。
代码语言:txt
复制
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;

public enum Status {
    ACTIVE("active"),
    INACTIVE("inactive");

    private final String value;

    Status(String value) {
        this.value = value;
    }

    @JsonValue
    public String getValue() {
        return value;
    }

    @JsonCreator
    public static Status fromValue(String value) {
        for (Status status : Status.values()) {
            if (status.value.equals(value)) {
                return status;
            }
        }
        throw new IllegalArgumentException("Unknown status: " + value);
    }
}

通过这种方式,Spring MVC可以正确地将查询参数中的值(如active)反序列化为枚举类型Status.ACTIVE

总结

  • @JsonProperty用于JSON序列化和反序列化。
  • @RequestParam用于处理HTTP请求中的查询参数。
  • 使用@JsonCreator@JsonValue注解可以确保枚举值在序列化和反序列化过程中的一致性。

希望这些信息对你有所帮助!

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 将JSON字符串反序列化为指定的.NET对象类型

    前言:   关于将JSON字符串反序列化为指定的.NET对象类型数据常见的场景主要是关于网络请求接口,获取到请求成功的响应数据。...本篇主要讲的的是如何通过使用Newtonsoft.Json中的JsonConvert.DeserializeObject(string value)方法将对应的JSON字符串转化为指定的.NET对象类型数据...方法二、直接将JSON字符串格式数据反序列化转化为字典数据(简单JSON字符串数据推荐使用): 如下一组简单的JSON字符串格式数据: { "id": "123456", "code"...,在通过key访问对应的value的值: var resultContext=JsonConvert.DeserializeObject>(JSON...格式数据); //获取msg的值: var msg=resultContext["msg"]; 输出为:操作成功

    3.1K20

    Jackson 常用注解

    @JacksonInject 通过 @JacksonInject 注解可以在 Jackson 反序列化的时候为空值字段动态赋值,当反序列化的对应属性值不存在时,可通过该注解为其动态设置值。...,如果对应的枚举值不存在 Jackson 默认会抛出异常。...我们可以通过 @JsonEnumDefaultValue 注解为未知的枚举类型赋一个默认值来兜底,但要记得在 ObjectMapper 中手动开启该功能。...Jackson 默认会把空值字段序列化为 null,我们可以通过 JsonInclude.Include.NON_NULL 来过滤掉空值字段: @Getter @Setter public class...String age;  } // 反序列化时可以将nm对应的值赋值到name字段上 通过 Access 枚举可以控制哪些属性可以进行序列化、反序列化,类似 @JsonIgnore 的效果。

    1.7K20

    做Java开发,你需要了解这些前言

    private Date createTime; private Date updateTime; } 三、枚举类的使用: 关于枚举类,我之前只是在学Java基础的时候了解过,后来老师教的一些demo...,加上如下注解,直接里面写api需要的字段名 @JsonProperty("name") private String categoryName; @JsonProperty("...注意:使用这个工具有两点要注意,第一个就是这两个对象的属性名要一致;第二就是null值也会拷贝进去,所以如果productInfo中有个属性值为null,进行拷贝后productInfoVo对应的属性值也会是...枚举类种我只是列举了两个例子,有异常就可以往枚举种添加,然后像上面那样用就行了。 八、生成随机数: 有时候数据表的Id没有设置自增,需要我们自己设置Id。...: @RequestParam: @GetMapping("/list") public ResultVo list(@RequestParam(value = "page",defaultValue

    86030

    Newtonsoft.Json高级用法

    8.枚举值的自定义格式化问题   9.自定义类型转换   10.全局序列化设置  一.忽略某些属性   类似本问开头介绍的接口优化,实体中有些属性不需要序列化返回,可以使用该特性。...二.默认值处理     序列化时想忽略默认值属性可以通过JsonSerializerSettings.DefaultValueHandling来确定,该值为枚举值 DefaultValueHandling.Ignore...设置属性是对序列化过程中所有属性生效的,想单独对某一个属性生效可以使用JsonProperty,下面将分别展示两个方式   1.JsonSerializerSettings Person p = new...2.JsonProperty ? 通过JsonProperty属性设置的方法,可以实现某一属性特别处理的需求,如默认值处理,空值处理,自定义属性名处理,格式化处理。...,在Type属性上加上了JsonConverter(typeof(StringEnumConverter))表示将枚举值转换成对应的字符串,而StringEnumConverter是Newtonsoft.Json

    3.1K100

    如何将一个 .NET 对象序列化为 HTTP GET 的请求字符串

    如果是 POST 请求时,我们可以使用一些库序列化为 json 格式作为 BODY 发送,那么 GET 请求呢?有可以直接将其序列化为 HTTP GET 请求的 query 字符串的吗?...key1=value&key2=value&key3=value 于是我们将一个类型序列化为后面的参数: 1 2 3 4 5 6 7 8 9 10 11 12 [DataContract] public...关于源代码包不引入额外依赖 dll 的原理,可以参见: .NET 将多个程序集合并成单一程序集的 4+3 种方法 - walterlv 方法 我们需要做的是,将一个对象序列化为 query 字符串。...(query, null) 将属性和值拼接起来 string.Join("&", properties) 然而真实场景可能比这个稍微复杂一点: 我们需要像 Newtonsoft.Json 一样,对于标记了...DataContract 的类,按照 DataMember 来序列化 URL 中的值需要进行转义 所以,我写出了下面的方法: 1 2 3 4 5 6 7 8 9 var isContractedType

    30920

    用了几年的 Fastjson,我最终替换成了Jackson!

    ,避免循环引用 对斜杠'/'进行转义 SerializerFeature.WriteSlashAsSpecial 关闭 - - jackson可以通过自定义Serializer实现相同效果,按需设置 将中文都会序列化为...关闭 - - 非标准特性,jackson并不支持 序列化Byte、Short、Integer、Long、Float、Double、Boolean及其对应原始类型field时,如果属性值为各自类型的默认值...,等价于jackson的@JsonProperty.index() int ordinal() default 0; // 序列化和反序列化时的字段名称映射,等价于jackson的@JsonProperty.value...; // 指定序列化时字段为null时使用的默认值,等价于jackson的@JsonProperty.defaultValue() String defaultValue() default...> deserializer() default Void.class; // 序列化时,如果filed是枚举类型,则和普通的java bean一样输出枚举的filed,而不是通常使用的Enum.name

    5.5K10

    Jackson 使用

    ObjectMapper在序列化时,将所有的字段一一序列化,无论这些字段是否有值 或者 为 null。..., User.class); // 反序列化为List的对象, 使用 TypeReference 这个标志 String json = "[{\"name\":\...如果需要”反序列化集合”的元素为非基本类型,可以通过创建一个空实现的TypeReference实例,将需要反序列化的集合带上泛型信息传递进去,以解决泛型信息无法传递的问题。...value: 定义逻辑属性的名称, 作用是把该属性的名称序列化为另外一个名称 access: 更改序列化和反序列化中逻辑属性的可见性 defaultValue: 用于记录预期的默认值 index: 定义与...,只返回了age的字符串值 接下来这个案例是枚举 搭配 JsonValue 使用的一种用法: Enums and @JsonValue public enum Distance { ...

    1.8K20

    Controller注解

    文章目录[隐藏] @RequestParam @RequestBody @RequestParam 作用:将请求参数绑定到控制器的方法参数上 语法: @RequestParam(value=”参数名...defaultValue:默认参数值,如果设置了该值,required=true将失效,自动为false,如果没有传该参数,就使用默认值 注意:当required=false时参数类型必须是对象,value...能转化为特定的模型属性;但是模型转json时,对应的转换后的key仍然与属性名一致 @JsonProperty注解,实现:json转模型时,使json中的特定key能转化为指定的模型属性;同样的,模型转...(value) 限制必须为一个不大于指定值的数字 @Min(value) 限制必须为一个不小于指定值的数字 @Past 限制必须是一个过去的日期 @Pattern(value) 限制必须符合指定的正则表达式...0) @NotBlank 验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0) @Email 验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式

    55310

    jackson中@JsonProperty、@JsonIgnore等常用注解总结

    @JsonProperty :此注解用于属性上,作用是把该属性的名称序列化为另外一个名称,如把trueName属性序列化为name,@JsonProperty("name")。...例如:使用该注解将以下表结构转化为Javabean:public class CustomerInfo{private int id;//使用 @JsonProperty注解将表结构中的字段映射到实体类中...使用情景:需要把一个List转换成json格式的数据传递给前台。但实体类中基本属性字段的值都存储在快照属性字段中。此时我可以在业务层中做处理,把快照属性字段的值赋给实体类中对应的基本属性字段。...String sourceAddress) { this.sourceAddress = sourceAddress;}}@JsonIgnoreProperties:此注解是类注解,作用是json序列化时将...@JsonInclude :属性值为null的不参与序列化。例子:@JsonInclude(Include.NON_NULL)

    3.9K30

    中篇|Jackson注解的用法和场景,建议收藏

    前言 今天我们接着上一篇文章梳理Jackson的注解。 Jackson注解一览 @JsonFormat 用于序列化和反序列化中特定格式的数据。...❝注意:JsonProperty注解的access也可以实现该注解的功能,不建议两个注解混用,这样可能发生冲突。 @JsonIgnoreProperties 这个也经常使用。...常用的JsonInclude.Include.NON_NULL可以过滤空值: Player player = new Player(); player.setId(1); player.setName(...@JsonProperty @JsonProperty也是常用注解。...用来标记属性或者属性的getter和setter方法上,用于指定属性的json名称,类似@JsonAlias的效果,同时配合其Access枚举可以实现那些属性可以序列化,那些属性可以反序列化(类似忽略的效果

    2.1K30

    序列化Java对象重命名字段,@JSONField、@JsonProperty、@SerializedName

    this.Name = Name; } /* 注解在get方法表示bean转换成json的时候会把实体类的Name属性值赋给json的Name */ @JSONField(name="Name...") public String getName(){ return this.Name; } } @JsonProperty 主要用于入参转换,和Json字符串序列化为Java对象 @JsonProperty...是com.fasterxml.jackson.annotation下使用频率很高的一个常用注解,用于将json字符串中的某个字段和java对象中的某个属性进行匹配映射,同时可以将java对象中的属性转换为指定字段的...,作用和@JsonProperty差不多,重点是可以将多个字段名称映射到一个字段属性上 SerializedName 改变了默认序列化和默认反序列化的字段取值,所以,如果你使用 Gson 将 Java...@SerializedName使对象属性序列化为想要的值 官网: https://www.baeldung.com/jackson-annotations http://www.javacreed.com

    14.3K20

    @RequestBody的使用

    注:如果参数前写了@RequestParam(xxx),那么前端必须有对应的xxx名字才行(不管其是否有值,当然可以通 过设置该注解的required属性来调节是否必须传),如果没有xxx...实体类的对应属性的类型要求时,会调用实体类的setter方法将值赋给该属性。...---- 全面的结论: 结论①:@JsonAlias注解,实现:json转模型时,使json中的特定key能转化为特定的模型属性;但是模型转json时, 对应的转换后的key...结论②:@JsonProperty注解,实现:json转模型时,使json中的特定key能转化为指定的模型属性;同样的,模 型转json时,对应的转换后的key为指定的key...,如果匹配一致且json中的该key对应的值 符合(或可转换为)实体类的对应属性的类型要求时,会调用实体类的setter方法将值赋给该属性。

    9.8K31

    Newtonsoft.Json

    , 下面讲一下一些特殊的设置,比如,转换时过滤掉个别属性、重命名字段名称、枚举字段的处理、私有变量的转换等; 序列化时忽略特定的属性字段 需求分析:数据交互时有时候不需要全部的属性内容,如只需要PeopleInfo...如下图: image.png 序列化时忽略空值的属性字段 分析:上上面的例子中,Name字段为Null值,假如实际前后端数据交互中,Null值的数据返回岂不是很没有意义?...: image.png 序列化时枚举值的处理 分析:在上面的例子中,所转换的Gender都是int类型的,假如,我们在转换Json时需要转换成对应的字符怎么操作?...方法来有条件地序列化属性,要有条件地序列化属性,需要在对象类中增加一个与该属性同名的布尔值的方法,然后使用ShouldSerialize作为方法名称的前缀,比如你要设置属性字段Name根据条件来动态决定是否序列化...方法的返回值必须是bool类型,如果返回true,表示这个属性可以序列化,返回false表示不被序列化。

    2.5K80

    后知后觉,Java枚举值也可以作为HTTP接口传参!

    通常情况下,这些参数可能是字符串、数字或者布尔值等形式的数据,但其实,枚举值也可以作为HTTP接口传参。 首先定义一个枚举类。...在updateUserStatus方法中,我们通过@RequestParam注解接收用户状态。这样,我们就可以在接口调用时传递枚举值,而不是字符串。 为什么枚举值可以作为HTTP接口传参呢?...其原因就在于,枚举在Java中本质上也是类,它们可以被序列化为字符串。在Spring框架中,@RequestParam会自动将字符串参数转换为对应的枚举值,前提是这些枚举值是公开的且在类中有定义。...status=0" 不过这种方法依赖于枚举值的顺序与序数的一致性,如果改变了枚举的顺序,可能会得到不正确的枚举值,不建议使用。 总结 使用枚举值作为HTTP接口的传参可以显著提高代码的可读性。...另外由于枚举值是预定义的,这意味着它们具有有限且确定的取值范围。如果尝试传递一个不在枚举定义中的值,编译器就会报错,从而避免了运行时错误的发生。

    18110

    Jackson问题汇总

    Jackson可以轻松的将Java对象转换成json对象和xml文档(即序列化),同样也可以将json、xml转换成Java对象(即反序列化)。...序列化时重命名字段 可以使用@JsonProperty来重命名字段,@JsonProperty能够在序列化和反序列化时给字段映射到指定的名字: 1 2 @JsonProperty("updatedBy"...) private String updateUserName; 如上,updateUserName在序列化为json时会被重命名为updatedBy,在反序列化时json中updatedBy的值会被映射到...将这个注解和MapStruct映射框架结合起来,可以通过定义@JsonProperty来避免额外定义MapStruct框架的不同名字段映射规则;比如:@Mapping(source = "updateUserName...// 这里将所有值为null、false、0的字段全部忽略 if (obj == null) { return true; } if

    1.9K10
    领券