Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala:Json文件上的Json排序操作,该文件具有不同的数据类型但模式相同_Json_Scala_Spray Json - Fatal编程技术网

Scala:Json文件上的Json排序操作,该文件具有不同的数据类型但模式相同

Scala:Json文件上的Json排序操作,该文件具有不同的数据类型但模式相同,json,scala,spray-json,Json,Scala,Spray Json,我有一个json文件,它有两种类型的数据用于存储和在线。但是很少列的数据类型是不同的,但是列名和模式是相同的。 我想使用Scala中的spray joson库对json进行一些排序、重新排列等操作,但我无法在josn上应用case类,因为“storeId”和“amount”的数据类型不同。 有没有办法重新编写case类来处理整数和字符串 示例:我将它们放在一个文件中,逐行读取并将其分配给字符串 给定inputJosn字符串: { “采购类型”:“1”, “purchaseChannel”:“商

我有一个json文件,它有两种类型的数据用于存储和在线。但是很少列的数据类型是不同的,但是列名和模式是相同的。 我想使用Scala中的spray joson库对json进行一些排序、重新排列等操作,但我无法在josn上应用case类,因为“storeId”和“amount”的数据类型不同。 有没有办法重新编写case类来处理整数和字符串

示例:我将它们放在一个文件中,逐行读取并将其分配给字符串


给定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?