GVKun编程网logo

jackson- 不输出null 的字段(jackson null配置成空字符串)

28

本文将分享jackson-不输出null的字段的详细内容,并且还将对jacksonnull配置成空字符串进行详尽解释,此外,我们还将为大家带来关于alibaba.fastjson允许输出NULL并且把

本文将分享jackson- 不输出null 的字段的详细内容,并且还将对jackson null配置成空字符串进行详尽解释,此外,我们还将为大家带来关于alibaba.fastjson允许输出NULL并且把字符串输出为“”、fastjson序列化时不输出值为null的字段、Float为null时,Jackson(JSON)抛出JsonMappingException、Jackson 与 SpringBoot 的实现:获取请求中存在的字段名称以及相应的字段映射的相关知识,希望对你有所帮助。

本文目录一览:

jackson- 不输出null 的字段(jackson null配置成空字符串)

jackson- 不输出null 的字段(jackson null配置成空字符串)

@JsonInclude(JsonInclude.Include.NON_NULL)
public class AntUiTreeNode {
}

alibaba.fastjson允许输出NULL并且把字符串输出为“”

alibaba.fastjson允许输出NULL并且把字符串输出为“”

使用JSON.toJSONString(str,SerializerFeature... serial);

SerializerFeature

QuoteFieldNames———-输出key时是否使用双引号,默认为true
WriteMapNullValue——–是否输出值为null的字段,默认为false
WriteNullNumberAsZero—-数值字段如果为null,输出为0,而非null

WriteNullListAsEmpty—–List字段如果为null,输出为[],51);">WriteNullStringAsEmpty—字符类型字段如果为null,输出为”“,255);">

WriteNullBooleanAsFalse–Boolean字段如果为null,输出为false,而非null

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;

public class JavaToJson {
    public static void main(String[] args) {
        Class<?> c;
        Object o;
        try {
            c = Class.forName("com.free.User");
            o = c.newInstance();
            String json = JSON.toJSONString(o,SerializerFeature.WriteMapNullValue,SerializerFeature.WriteNullStringAsEmpty);
            System.out.println(json);
        } catch (Exception e) {
        }
        
       
    }
}

fastjson序列化时不输出值为null的字段

fastjson序列化时不输出值为null的字段

Map < String , Object > jsonMap = new HashMap< String , Object>();  
jsonMap.put("a",1);  
jsonMap.put("b","");  
jsonMap.put("c",null);  
jsonMap.put("d","wuzhuti.cn");  
  
String str = JSONObject.toJSONString(jsonMap);  
System.out.println(str);  
//输出结果:{"a":1,"b":"",d:"wuzhuti.cn"}  

从输出结果可以看出,null对应的key已经被过滤掉;这明显不是我们想要的结果,这时我们就需要用到fastjson的SerializerFeature序列化属性

也就是这个方法:JSONObject.toJSONString(Object object, SerializerFeature... features)

SerializerFeature有用的一些枚举值

QuoteFieldNames———-输出key时是否使用双引号,默认为true 
WriteMapNullValue——–是否输出值为null的字段,默认为false 
WriteNullNumberAsZero—-数值字段如果为null,输出为0,而非null 
WriteNullListAsEmpty—–List字段如果为null,输出为[],而非null 
WriteNullStringAsEmpty—字符类型字段如果为null,输出为”“,而非null 
WriteNullBooleanAsFalse–Boolean字段如果为null,输出为false,而非null

现在加上

Map < String , Object > jsonMap = new HashMap< String , Object>();  
jsonMap.put("a",1);  
jsonMap.put("b","");  
jsonMap.put("c",null);  
jsonMap.put("d","wuzhuti.cn");  
  
String str = JSONObject.toJSONString(jsonMap,SerializerFeature.WriteMapNullValue);  
System.out.println(str);  
//输出结果:{"a":1,"b":"","c":null,"d":"wuzhuti.cn"}  

 

Float为null时,Jackson(JSON)抛出JsonMappingException

Float为null时,Jackson(JSON)抛出JsonMappingException

我正在使用Spring(与Jackson一起)和jQuery来将表单作为对象传递。我的pojo包含可为空的浮点数。但是,当字段为空时,Jackson会抛出Exeption:

org.codehaus.jackson.map.JsonMappingException: Can not construct instance of java.lang.Float from String value '''': not a valid double value

为了允许空值(或表单字段中的空值),我该怎么办?

谢谢Er

答案1

小编典典

默认情况下,Jackson确实仅将显式JSON
null视为空值。但是,如果需要从空String强制为null,则添加功能请求很容易。实际上,这听起来像是一个不错的改进-
这是开源项目经常基于用户对他们认为应该存在的东西,事物应该如何工作的要求而得到改进的方式。

在短期内,您还可以注册接受空String并产生null的自定义反序列化器(尽管不是指南,http:
//wiki.fasterxml.com/JacksonHowToCustomDeserializers会介绍一些相关信息)。

Jackson 与 SpringBoot 的实现:获取请求中存在的字段名称以及相应的字段映射

Jackson 与 SpringBoot 的实现:获取请求中存在的字段名称以及相应的字段映射

如何解决Jackson 与 SpringBoot 的实现:获取请求中存在的字段名称以及相应的字段映射?

我有一个要求,在如下不同的情况下抛出不同的错误,并且有很多这样的字段,而不仅仅是 1。

例如

  1.    {
        "id": 1,"name": "nameWithSpecialChar$"
       }    
    

    这里应该为特殊字符抛出错误。

  2.    {
         "id": 1,"name": null
       }   
    

    这里抛出字段空错误。

  3.    {
        "id": 1
       }   
    

    这里抛出字段缺失错误。

处理,第 1 和第 2 种情况很容易,但对于第 3 种情况,有什么方法可以让我们在使用 Jackson 进行序列化时在输入 json 中传递的字段名称列表?

一种方法,我可以通过将请求映射到 JsonNode 来实现,然后检查节点是否存在所需字段,然后手动反序列化该 JsonNode,然后验证其余成员,如下所示。

    public ResponseEntity myGetRequest(@RequestBody JsonNode requestJsonNode) {

    if(!requestJsonNode.has("name")){
      throw some error;
    }

    MyRequest request = ObjectMapper.convertValue(requestJsonNode,MyRequest .class);
    validateIfFieldsAreInvalid(request);

但是我不喜欢这种方法,有没有其他方法可以做到?

解决方法

您可以定义一个 JSON schema 并根据它验证您的对象。在您的示例中,您的架构可能如下所示:

{
  "$schema": "https://json-schema.org/draft/2020-12/schema","type": "object","properties": {
    "id": {
      "description": "The identifier","type": "integer"
    },"name": {
      "description": "The item name","type": "string","pattern": "^[a-zA-Z]*$"
    }
  },"required": [ "id","name" ]
}

要验证您的对象,您可以使用 json-schema-validator 库。这个库建立在杰克逊之上。由于您无论如何都在使用 Spring Boot,因此您已经导入了 Jackson。

示例代码大致如下:

String schema = "<define your schema here>";
String data = "<put your data here>";

JsonSchemaFactory factory = JsonSchemaFactory.byDefault();
ObjectMapper m = new ObjectMapper();
JsonSchema jsonSchema = factory.getJsonSchema(m.readTree(schema));
JsonNode json = m.readTree(data);
ProcessingReport report = jsonSchema.validate(json);

System.out.println(report);

报告包含不同输入案例的详细错误。例如,有了这个输入

{
  "id": 1,"name": "nameWithSpecialChar$"
}

这个输出被打印出来

--- BEGIN MESSAGES ---
error: ECMA 262 regex "^[a-zA-Z]*$" does not match input string "nameWithSpecialChar$"
    level: "error"
    schema: {"loadingURI":"#","pointer":"/properties/name"}
    instance: {"pointer":"/name"}
    domain: "validation"
    keyword: "pattern"
    regex: "^[a-zA-Z]*$"
    string: "nameWithSpecialChar$"
---  END MESSAGES  ---

或者不只是打印报告,您可以遍历所有错误并拥有您的特定逻辑

for (ProcessingMessage message : report) {
    // Add your logic here
}

您可以查看 example code 以获取有关如何使用图书馆的更多信息。

我们今天的关于jackson- 不输出null 的字段jackson null配置成空字符串的分享就到这里,谢谢您的阅读,如果想了解更多关于alibaba.fastjson允许输出NULL并且把字符串输出为“”、fastjson序列化时不输出值为null的字段、Float为null时,Jackson(JSON)抛出JsonMappingException、Jackson 与 SpringBoot 的实现:获取请求中存在的字段名称以及相应的字段映射的相关信息,可以在本站进行搜索。

本文标签: