Scala:Json文件上的Json排序操作,该文件具有不同的数据类型但模式相同
我有一个json文件,它有两种类型的数据用于存储和在线。但是很少列的数据类型是不同的,但是列名和模式是相同的。 我想使用Scala中的spray joson库对json进行一些排序、重新排列等操作,但我无法在josn上应用case类,因为“storeId”和“amount”的数据类型不同。 有没有办法重新编写case类来处理整数和字符串 示例:我将它们放在一个文件中,逐行读取并将其分配给字符串Scala:Json文件上的Json排序操作,该文件具有不同的数据类型但模式相同,json,scala,spray-json,Json,Scala,Spray Json,我有一个json文件,它有两种类型的数据用于存储和在线。但是很少列的数据类型是不同的,但是列名和模式是相同的。 我想使用Scala中的spray joson库对json进行一些排序、重新排列等操作,但我无法在josn上应用case类,因为“storeId”和“amount”的数据类型不同。 有没有办法重新编写case类来处理整数和字符串 示例:我将它们放在一个文件中,逐行读取并将其分配给字符串 给定inputJosn字符串: { “采购类型”:“1”, “purchaseChannel”:“商
给定inputJosn字符串:
{
“采购类型”:“1”,
“purchaseChannel”:“商店”,
“存储ID”:6167,
“paymentType”:[{
“类型”:“现金”,
“类别”:“现金”,
“金额”:3.91
}]
},
{
“采购类型”:“2”,
“purchaseChannel”:“在线”,
“存储ID”:“6168”,
“paymentType”:[{
“类型”:“卡片”,
“类别”:“卡片”,
“金额”:“5.04”
}]
}
代码:
import spray.json._
import DefaultJsonProtocol._
case class payType(`type`:String,category:String,amount:String)
case class Transactions(purchaseType:String,purchaseChannel:String,storeId:String,paymentType: payType )
object MyJsonpayType extends DefaultJsonProtocol {
implicit val payTypeFormat: JsonFormat[payType] = jsonFormat3(payType)
}
import MyJsonpayType._
object MyJsonTransactions extends DefaultJsonProtocol {
implicit val TransactionsFormat: JsonFormat[Transactions] = jsonFormat4(Transactions)
}
import MyJsonTransactions._
inputJosn.parseJson.convertTo[Transactions]
它抛出错误,说expecing JsString,但得到6167
我知道它为什么会抛出错误,但这些方法是否可以更好地重新编写case类来处理整数和字符串
case class payType(`type`:String,category:String,amount:Either[Double,String])
但是,你只是在沿路踢罐子。如果必须对amount字段执行任何操作,如-sort、aggregation,则需要对数据进行标准化
如果是这种情况,我最好为具有单一类型的对象编写自定义反序列化 你可以使用其中任何一种,比如
case class payType(`type`:String,category:String,amount:Either[Double,String])
但是,你只是在沿路踢罐子。如果必须对amount字段执行任何操作,如-sort、aggregation,则需要对数据进行标准化
如果是这种情况,我最好为具有单一类型的对象编写自定义反序列化 在这些情况下,我喜欢使用Jackson库,但是在这种情况下,您可以调用
存储ID
:字符串
。之后,您可以使用伴生对象将其解析为long
试试这个:
case class Transactions (
purchaseType:String,
purchaseChannel:String,
storeId:String,
paymentType: payType ) {
def storeIdToLong(t: Transaction) = TransactionsAsLong(
purchaseType = t.purchaseType,
purchaseChannel = t.purchaseChannel,
storeId = t.storeId.toLong,
paymentType = t.paymentType
)
}
case class TransactionsAsLong (
purchaseType:String,
purchaseChannel:String,
storeId:Long,
paymentType: payType )
object Transactions {
implicit def transactions_to_long(t: Transactions): TransactionsAsLong = t.storeIdToLong()
}
现在,如果需要,您可以编写valtest:Transaction=TransactionsAsLong(…)
我建议改为编写自定义反序列化程序:-)在这些情况下,我喜欢使用Jackson库,但在这种情况下,您可以调用
存储ID
:字符串
。之后,您可以使用伴生对象将其解析为long
试试这个:
case class Transactions (
purchaseType:String,
purchaseChannel:String,
storeId:String,
paymentType: payType ) {
def storeIdToLong(t: Transaction) = TransactionsAsLong(
purchaseType = t.purchaseType,
purchaseChannel = t.purchaseChannel,
storeId = t.storeId.toLong,
paymentType = t.paymentType
)
}
case class TransactionsAsLong (
purchaseType:String,
purchaseChannel:String,
storeId:Long,
paymentType: payType )
object Transactions {
implicit def transactions_to_long(t: Transactions): TransactionsAsLong = t.storeIdToLong()
}
现在,如果需要,您可以编写valtest:Transaction=TransactionsAsLong(…)
我建议改为编写一个自定义反序列化程序:-)类型T>:字符串带Int为什么不能将其用于storeId?类型T>:字符串带Int为什么不能将其用于storeId?