Scala对象数据封装成json, 测试空数据。
//打印测试
val value1: DataStream[ String ] = orderWideWithNoDimDS.map( line => {
// orderWideWithNoDimDS:DataStream[ OrderWide ]
val nObject = JSON.toJSONString(line)
nObject
})
value1.print("WideNoDimDS >>")
输出:WideNoDimDS >> {}
问题:
1、scala对象无法序列化
2、sclaa对象序列化后为空
解决方案:
1、样例类()、普通类 {} 必须加上注解@BeanProperty,这样scala的类中的属性就有了get,set方法。
2、我写的是fastjosn将scala的对象转换成json并输出,值得注意的是,使用scala代码需要指定 JSON.toJSONString的第二的参数,否则,对象的属性的值为空,第二个参数部分列举如下:
名称 | 含义 |
---|---|
QuoteFieldNames | 输出key时是否使用双引号,默认为true |
UseSingleQuotes | 使用单引号而不是双引号,默认为false |
WriteMapNullValue | 是否输出值为null的字段,默认为false |
WriteEnumUsingToString | Enum输出name()或者original,默认为false |
SortField | 按字段名称排序后输出。默认为false |
WriteTabAsSpecial | 把\t做转义输出,默认为false |
PrettyForma | 结果是否格式化,默认为false |
WriteClassName | 序列化时写入类型信息,默认为false。反序列化是需用到 |
3、此时有一个对象x是ItemRelevant类,那么x转换成json格式的代码如下:
val y = JSON.toJSONString(x, SerializerFeature.PrettyFormat)
4、修改代码
//打印测试
val value1: DataStream[ String ] = orderWideWithNoDimDS.map( line => {
val nObject = JSON.toJSONString(line, SerializerFeature.PrettyFormat)
nObject
})
value1.print("WideNoDimDS >>")
class OrderWide {
@BeanProperty var detail_id = 0L
...
}
输出测试:
WideNoDimDS>>>>> {
"activity_reduce_amount":0.00,
"category3_id":0,
"coupon_reduce_amount":0.00,
"create_time":"2022-06-29 01:18:10",
"detail_id":81961,
"feight_fee":15.00,
"order_id":27653,
"order_price":9199.00,
"order_status":"1001",
"original_total_amount":27597.00,
"province_id":22,
"sku_id":18,
"sku_name":"TCL 75Q10 75英寸 QLED原色量子点电视 安桥音响 AI声控智慧屏 超薄全面屏 MEMC防抖 3+32GB 平板电视",
"sku_num":3,
"split_total_amount":27597.00,
"spu_id":0,
"tm_id":0,
"total_amount":27612.00,
"user_id":36
}