Scala對象數據封裝成json並輸出


背景:

Sparkstreaming計算完成的數據封裝成對象后需要轉換成json並輸出到Redis

問題:

1、scala對象無法序列化

2、sclaa對象序列化后為空

解決方案:

1、樣例類必須加上注解@BeanProperty,這樣scala的類中的屬性就有了get,set方法

case class ItemRelevant(
                         @BeanProperty anchorId: Long = 0L, //主播id
                         @BeanProperty liveId: Long, //直播id
                         @BeanProperty itemId: Long, //商品id
                         @BeanProperty itemName: String, //商品名字
                         @BeanProperty itemPrice: Double, //商品直播價格
                         @BeanProperty shopName: String, //店鋪名字
                         @BeanProperty cateName: String, //商品類目
                         @BeanProperty upTime: String, //商品上架時間
                         @BeanProperty image: String, //商品圖片
                         @BeanProperty var saleNum: Long = 0L, //商品實時銷量
                         @BeanProperty var salesVolume: Double = 0.0, //商品實時銷售額
                         //機器本地時間 2020-10-09 使用此樣例類,此參數不需要傳入
                         @BeanProperty var dayString: String = null, //年月日
                         //機器本地時間 11:20:30 使用此樣例類,此參數不需要傳入
                         @BeanProperty var hmString: String = null) { //時分秒
  val date = new Date(System.currentTimeMillis())
  dayString = new SimpleDateFormat("yyyy-MM-dd").format(date)
  hmString = new SimpleDateFormat("HH:mm:ss").format(date)
}

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)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM