Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Groovy里自定义JSON输出-JsonGenerator

Groovy里自定义JSON输出-JsonGenerator

作者头像
白石
发布于 2019-08-23 02:00:01
发布于 2019-08-23 02:00:01
2.4K00
代码可运行
举报
文章被收录于专栏:白石白石
运行总次数:0
代码可运行

自定义JSON输出-JsonGenerator

Groovy 2.5.0增加了通过JsonGenerator实例自定义JSON输出。 将对象转换为JSON字符串值的最简单方法是通过JsonOutput.toJson。 此方法使用默认的JsonGenerator,其JSON输出具有合理的默认值。 但是我们可以使用自定义生成器并创建JSON输出。 要创建自定义生成器,我们使用可通过JsonGenerator.Options访问的构建器。 通过流式的API,我们可以例如忽略输出中带有null值的字段,更改日期的日期格式,并按名称或值的类型忽略字段。 我们可以通过将转换的实现添加为Closure或者实现JsonGenerator.Converter接口来为类型添加自定义转换器。 要获取JSON字符串,我们只需调用生成器的toJson方法。

在下面的示例Groovy代码中,我们有一个带有数据的Map,我们想将它转换为JSON。 首先我们使用默认生成器然后创建自己的生成器来自定义JSON输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Sample class to be used in JSON.
@groovy.transform.TupleConstructor
class Student {
    String firstName, lastName
}
 
def data =
    [student: new Student('Hubert', 'Klein Ikkink'),
     dateOfBirth: Date.parse('yyyyMMdd', '19730709'),
     website: 'https://www.mrhaki.com'.toURL(),
     password: 'IamSecret',
     awake: Optional.empty(),
     married: Optional.of(true),
     location: null,
     currency: '\u20AC' /* Unicode EURO */]
      
 
import groovy.json.JsonGenerator
import groovy.json.JsonGenerator.Converter
         
// Default JSON generator. This generator is used by
// Groovy to create JSON if we don't specify our own.
// For this example we define the default generator
// explicitly to see the default output.      
def jsonDefaultOutput = new JsonGenerator.Options().build()
         
// Use generator to create JSON string.
def jsonDefaultResult = jsonDefaultOutput.toJson(data) // Or use JsonOutput.toJson(data)
 
assert jsonDefaultResult == '{"student":{"firstName":"Hubert","lastName":"Klein Ikkink"},' +
    '"dateOfBirth":"1973-07-08T23:00:00+0000","website":"https://www.mrhaki.com","password":"IamSecret",' +
    '"awake":{"present":false},"married":{"present":true},"location":null,"currency":"\\u20ac"}'
 
 
// Define custom rules for JSON that will be generated.
def jsonOutput =
    new JsonGenerator.Options()
        .excludeNulls()  // Do not include fields with value null.
        .dateFormat('EEEE dd-MM-yyyy', new Locale('nl', 'NL')) // Set format for dates.
        .timezone('Europe/Amsterdam') // Set timezone to be used for formatting dates.
        .excludeFieldsByName('password')  // Exclude fields with given name(s).
        .excludeFieldsByType(URL)  // Exclude fields of given type(s).
        .disableUnicodeEscaping()  // Do not escape UNICODE.
        .addConverter(Optional) { value -> value.orElse('UNKNOWN') } // Custom converter for given type defined as Closure.
        .addConverter(new Converter() {  // Custom converter implemented via Converter interface.
         
            /**
             * Indicate which type this converter can handle.
             */
            boolean handles(Class<?> type) {
                return Student.isAssignableFrom(type)
            }
             
            /**
             * Logic to convert Student object.
             */
            Object convert(Object student, String key) {
                "$student.firstName $student.lastName"
            }
             
        })
        .build()  // Create the converter instance.
 
// Use generator to create JSON from Map data structure.
def jsonResult = jsonOutput.toJson(data)
 
assert jsonResult == '{"student":"Hubert Klein Ikkink",' +
    '"dateOfBirth":"maandag 09-07-1973",' +
    '"awake":"UNKNOWN","married":true,"currency":"€"}'

JsonBuilderStreamingJsonBuilder类现在也支持使用JsonGenerator实例。 需要创建JSON输出时使用生成器。 使用自定义生成器不会更改构建器的内部数据结构

在下面的示例中,我们使用前一个示例的自定义生成器,并将其应用于JsonBuilderStreamingJsonBuilder实例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import groovy.json.JsonBuilder
 
// We can use a generator instance as constructor argument
// for JsonBuilder. The generator is used when we create the
// JSON string. It will not effecct the internal JSON data structure.
def jsonBuilder = new JsonBuilder(jsonOutput)
jsonBuilder {
    student new Student('Hubert', 'Klein Ikkink')
    dateOfBirth Date.parse('yyyyMMdd', '19730709')
    website 'https://www.mrhaki.com'.toURL()
    password 'IamSecret'
    awake Optional.empty()
    married Optional.of(true)
    location null
    currency  '\u20AC'
}
 
def jsonBuilderResult = jsonBuilder.toString()
 
assert jsonBuilderResult == '{"student":"Hubert Klein Ikkink",' +
    '"dateOfBirth":"maandag 09-07-1973",' +
    '"awake":"UNKNOWN","married":true,"currency":"€"}'
 
// The internal structure is unaffected by the generator.
assert jsonBuilder.content.password == 'IamSecret'
assert jsonBuilder.content.website.host == 'www.mrhaki.com'
 
 
import groovy.json.StreamingJsonBuilder
 
new StringWriter().withWriter { output ->
 
    // As with JsonBuilder we can provide a custom generator via
    // the constructor for StreamingJsonBuilder.
    def jsonStreamingBuilder = new StreamingJsonBuilder(output, jsonOutput)
    jsonStreamingBuilder {
        student new Student('Hubert', 'Klein Ikkink')
        dateOfBirth Date.parse('yyyyMMdd', '19730709')
        website 'https://www.mrhaki.com'.toURL()
        password 'IamSecret'
        awake Optional.empty()
        married Optional.of(true)
        location null
        currency  '\u20AC'
    }
 
    def jsonStreamingBuilderResult = output.toString()
     
    assert jsonStreamingBuilderResult == '{"student":"Hubert Klein Ikkink",' +
        '"dateOfBirth":"maandag 09-07-1973",' +
        '"awake":"UNKNOWN","married":true,"currency":"€"}'
}

用Groovy 2.5.0编写。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Groovy 添加带注释的Map构造函数
从Groovy的早期开始,我们可以创建POGO(Plain Old Groovy Objects)类,它们将具有带有Map参数的构造函数。 Groovy在生成的类中自动添加构造函数。我们可以使用命名参数来创建POGO的实例,因为Map参数构造函数。 这只有在我们不添加自己的构造函数且属性不是最终的时才有效。从Groovy 2.5.0开始,我们可以使用@MapConstrutor AST转换注释来添加带有Map参数的构造函数。使用注释我们可以有更多选项来自定义生成的构造函数。例如,我们可以让Groovy使用Map参数生成构造函数,并添加我们自己的构造函数。 属性也可以是final,我们仍然可以使用带有Map参数的构造函数。
白石
2019/08/23
1.2K0
【Groovy】json 序列化 ( 类对象转为 json 字符串 | 使用 JsonBuilder 进行转换 | 使用 JsonOutput 进行转换 | 将 json 字符串格式化输出 )
创建 json 生成器 JsonBuilder 对象 , 构造函数中传入 Student 对象 , 即可完成 json 转换 , 将 Student 对象转为了 json 字符串 ;
韩曙亮
2023/03/30
9K0
【Groovy】json 序列化 ( 类对象转为 json 字符串 | 使用 JsonBuilder 进行转换 | 使用 JsonOutput 进行转换 | 将 json 字符串格式化输出 )
Groovy 使用EqualsAndHashCode注解生成equals和hashcode方法
Groovy 1.8中有很多新的字节码生成注释。 其中一个是@EqualsAndHashCode注释。 使用此注释,为类生成equals()和hashCode()方法。 hashCode()方法是使用Groovyorg.codehaus.groovy.util.HashCodeHelper实现的(遵循书中的算法 Effective Java )。 equals()方法查看类的所有单个属性,以查看两个对象是否相同。
白石
2019/09/09
1.9K0
Groovy 处理JSON
Groovy自带了转换JSON的功能,相关类都在groovy.json包下。本文参考自Groovy文档 Parsing and producing JSON。
乐百川
2022/05/05
2.2K0
【Groovy】json 序列化 ( JsonBuilder 生成器 | 生成带根节点名称的 json 字符串 | 生成不带根节点名称的 json 字符串 )
然后 , 如果生成一个带根节点名称的 json 字符串 ,需要使用 jsonBuilder.根节点名称 = {闭包} 格式的代码 , 生成 json 字符串 ;
韩曙亮
2023/03/30
1.8K0
【Groovy】json 序列化 ( JsonBuilder 生成器 | 生成带根节点名称的 json 字符串 | 生成不带根节点名称的 json 字符串 )
《Groovy极简教程》第12章 Groovy的JSON包《Groovy极简教程》JsonOutputJsonSlurper
Groovy自带了转换JSON的功能,相关类都在groovy.json包下。本文参考自Groovy文档 Parsing and producing JSON。
一个会写诗的程序员
2018/08/20
2.1K1
Groovy秘诀 顶
听说java世界里有个Groovy大神!java需要半天处理的事情,Groovy只需要几分钟,是的,几分钟…剩下来的时间,程序员终于有时间泡妹子了,^_^…….技术宅的兄弟,赶紧来看看吧。
白石
2019/08/23
4.7K0
从 Java 和 JavaScript 来学习 Haskell 和 Groovy(DSL)
这是《从 Java 和 JavaScript 来学习 Haskell 和 Groovy》系列的第四篇。
四火
2022/07/19
5480
从 Java 和 JavaScript 来学习 Haskell 和 Groovy(DSL)
聊聊如何自定义数据脱敏
本示例通过替换的手段实现脱敏,然后配合常用的框架特性,比如mybatis的拦截器机制或者json的序列化来快速实现脱敏
lyb-geek
2021/12/28
1.8K0
聊聊如何自定义数据脱敏
ASP.NET Core AutoWrapper 自定义响应输出
AutoWrapper是一个简单可自定义全局异常处理程序和ASP.NET Core API响应的包装。他使用ASP.NET Core middleware拦截传入的HTTP请求,并将最后的结果使用统一的格式来自动包装起来.目的主要是让我们更多的关注业务特定的代码要求,并让包装器自动处理HTTP响应。这可以在构建API时加快开发时间,同时为HTTP响应试试我们统一的标准。
HueiFeng
2020/04/01
1.6K0
根据指定键对自定义 JSON 输出
接下来,我们将用 Python 演示这些操作,结合 json 模块解析和处理 JSON 数据。
华科云商小徐
2024/10/14
1910
【Groovy】自定义 Xml 生成器 BuilderSupport ( nodeCompleted 方法获取节点闭合信息 )
在之前的博客中 , 在 BuilderSupport#createNode 方法中创建了 Xml 节点 , 在 BuilderSupport#setParent 方法中设置了 Xml 节点之间的父子关系 ;
韩曙亮
2023/03/30
4670
【Groovy】自定义 Xml 生成器 BuilderSupport ( nodeCompleted 方法获取节点闭合信息 )
Jaskson精讲第6篇-自定义JsonSerialize与Deserialize实现数据类型转换
Jackson是Spring Boot(SpringBoot)默认的JSON数据处理框架,但是其并不依赖于任何的Spring 库。有的小伙伴以为Jackson只能在Spring框架内使用,其实不是的,没有这种限制。它提供了很多的JSON数据处理方法、注解,也包括流式API、树模型、数据绑定,以及复杂数据类型转换等功能。它虽然简单易用,但绝对不是小玩具,更多的内容我会写成一个系列,5-10篇文章,请您继续关注我。
字母哥博客
2020/09/24
3.6K0
Jaskson精讲第6篇-自定义JsonSerialize与Deserialize实现数据类型转换
【Groovy】json 字符串反序列化 ( 使用 JsonSlurper 进行 json 字符串反序列化 | 根据 map 集合构造相关类 )
然后 , 调用该 JsonSlurper 对象的 parse 方法 , 可以对不同类型的 json 数据进行反序列化 ;
韩曙亮
2023/03/30
1.4K0
【Groovy】json 字符串反序列化 ( 使用 JsonSlurper 进行 json 字符串反序列化 | 根据 map 集合构造相关类 )
【Groovy】自定义 Xml 生成器 BuilderSupport ( 创建 XmlNode 节点 | 管理 XmlNode 节点并将根节点转为 Xml 信息 | 完整代码示例 )
在 class MyBuilderSupport extends BuilderSupport 类中维护一个 Map 集合 , 该 Map 集合用于存储 上一篇博客 【Groovy】自定义 Xml 生成器 BuilderSupport ( 构造 Xml 节点类 | 封装节点名称、节点值、节点属性、子节点 | 将封装的节点数据转为 Xml 字符串 ) 中封装的 XmlNode 节点 ;
韩曙亮
2023/03/30
7580
【Groovy】自定义 Xml 生成器 BuilderSupport ( setParent 方法中设置父节点与子节点关系 )
在自定义的 Xml 生成器 MyBuilderSupport 中的 setParent 方法是设置节点之间父子关系的方法 , 在调用了 Object createNode(Object name, Map attributes, Object value) 方法返回非空值后 , 会自动回调该方法 ; ( 注意 : 一定要返回非空值 )
韩曙亮
2023/03/30
7180
给JSONObject添加自定义遍历方法
经过了Groovy动态添加方法和属性及Spock单测的铺垫,今天用fastjson为例,演示如何给JSONObject添加一个自定义的方法,来帮助提高编程效率。
FunTester
2021/11/04
2K0
logback自定义json日志输出
先说下楼主的使用场景吧,将程序的某些方法调用以json格式的内容记录到文件中,提供给大数据做数据分析用。当然这个需求实现起来很简单,通过aop拦截切面统一输出内容到文件即可。下面要介绍的就是通过logback日志体系以及logstash提供的json log依赖将数据以json格式记录到日志文件的例子。
kl博主
2023/11/18
7110
logback自定义json日志输出
自定义Data Sink
上一篇文章介绍了 Flink Data Sink,也介绍了 Flink 自带的 Sink,那么如何自定义自己的 Sink 呢?这篇文章将写一个 demo 教大家将从 Kafka Source 的数据 Sink 到 MySQL 中去。
zeekling
2022/06/17
3150
自定义Data Sink
【Groovy】自定义 Xml 生成器 BuilderSupport ( 继承 BuilderSupport 抽象类 | 在 createNode 方法中获取节点名称、节点属性、节点值信息 )
参考 Xml 生成器 MarkupBuilder , 自定义开发一个 Xml 生成器 ;
韩曙亮
2023/03/30
2.1K0
【Groovy】自定义 Xml 生成器 BuilderSupport ( 继承 BuilderSupport 抽象类 | 在 createNode 方法中获取节点名称、节点属性、节点值信息 )
推荐阅读
Groovy 添加带注释的Map构造函数
1.2K0
【Groovy】json 序列化 ( 类对象转为 json 字符串 | 使用 JsonBuilder 进行转换 | 使用 JsonOutput 进行转换 | 将 json 字符串格式化输出 )
9K0
Groovy 使用EqualsAndHashCode注解生成equals和hashcode方法
1.9K0
Groovy 处理JSON
2.2K0
【Groovy】json 序列化 ( JsonBuilder 生成器 | 生成带根节点名称的 json 字符串 | 生成不带根节点名称的 json 字符串 )
1.8K0
《Groovy极简教程》第12章 Groovy的JSON包《Groovy极简教程》JsonOutputJsonSlurper
2.1K1
Groovy秘诀 顶
4.7K0
从 Java 和 JavaScript 来学习 Haskell 和 Groovy(DSL)
5480
聊聊如何自定义数据脱敏
1.8K0
ASP.NET Core AutoWrapper 自定义响应输出
1.6K0
根据指定键对自定义 JSON 输出
1910
【Groovy】自定义 Xml 生成器 BuilderSupport ( nodeCompleted 方法获取节点闭合信息 )
4670
Jaskson精讲第6篇-自定义JsonSerialize与Deserialize实现数据类型转换
3.6K0
【Groovy】json 字符串反序列化 ( 使用 JsonSlurper 进行 json 字符串反序列化 | 根据 map 集合构造相关类 )
1.4K0
【Groovy】自定义 Xml 生成器 BuilderSupport ( 创建 XmlNode 节点 | 管理 XmlNode 节点并将根节点转为 Xml 信息 | 完整代码示例 )
7580
【Groovy】自定义 Xml 生成器 BuilderSupport ( setParent 方法中设置父节点与子节点关系 )
7180
给JSONObject添加自定义遍历方法
2K0
logback自定义json日志输出
7110
自定义Data Sink
3150
【Groovy】自定义 Xml 生成器 BuilderSupport ( 继承 BuilderSupport 抽象类 | 在 createNode 方法中获取节点名称、节点属性、节点值信息 )
2.1K0
相关推荐
Groovy 添加带注释的Map构造函数
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验