Scala 解析 JSON 在一个函数中表现不同
Scala Parsing JSON behaving differently in a function
我正在尝试创建一个函数来解析我的记录,当我调用一个函数与对它进行硬编码时,我得到了两种不同的行为:
我正在使用:
import org.json4s.JsonAST.{JString, JField, JObject, JArray}
import org.json4s.jackson.JsonMethods._
val parsed = parse("""{"timestamp":"2016-06-02 13:40:16,772","tableName":"stg_mde_campaign_master","dbName":"stg_bankrtl_mde","owner":"hive","location":"null"}""")
val output = for {
JObject(child) <- parsed
JField("timestamp", JString(subject1)) <- child
JField("tableName", JString(obj1)) <- child
} yield (subject1,obj1)
会输出(我想要的):
output: List[(String, String)] = List((2016-06-02 13:40:16,772,stg_mde_campaign_master)
但是当我将它转移到一个函数时,我得到:
def getSubOb(record: String, subject:String, obj:String): List[(String, String)] = {
val parsed = parse(record)
val output: List[(String, String)] = for {
JObject(child) <- parsed
JField(subject, JString(subject1)) <- child
JField(obj, JString(obj1)) <- child
} yield (subject1, obj1)
output
}
val something = getSubOb("""{"timestamp":"2016-06-02 13:40:16,772","tableName":"stg_mde_campaign_master","dbName":"stg_bankrtl_mde","owner":"hive","location":"null"}""", "timestamp", "tableName")
输出行为很奇怪:
something: List[(String, String)] = List((2016-06-02 13:40:16,772,2016-06-02 13:40:16,772), (2016-06-02 13:40:16,772,stg_mde_campaign_master), (2016-06-02 13:40:16,772,stg_bankrtl_mde), (2016-06-02 13:40:16,772,hive), (2016-06-02 13:40:16,772,null), (stg_mde_campaign_master,2016-06-02 13:40:16,772), (stg_mde_campaign_master,stg_mde_campaign_master), (stg_mde_campaign_master,stg_bankrtl_mde), (stg_mde_campaign_master,hive), (stg_mde_campaign_master,null), (stg_bankrtl_mde,2016-06-02 13:40:16,772), (stg_bankrtl_mde,stg_mde_campaign_master), (stg_bankrtl_mde,stg_bankrtl_mde), (stg_bankrtl_mde,hive), (stg_bankrtl_mde,null), (hive,2016-06-02 13:40:16,772), (hive,stg_mde_campaign_master), (hive,stg_bankrtl_mde), (hive,hive), (hive,null), (null,2016-06-02 13:40:16,772), (null,stg_mde_campaign_...
您在 unapply
上有一个细微的错误。
模式匹配左侧的小写术语被视为变量。
所以一切都匹配并绑定在那里。
您可以像在“变量名”中那样使用反引号来告诉 Scala 它不是要绑定的变量,而是匹配模式左侧要匹配的值。
参见:lowercased variables in pattern matching
这应该可以正常工作:
def getSubOb(record: String, subject:String, obj:String): List[(String, String)] = for {
JObject(child) <- parse(record)
JField(`subject`, JString(subject1)) <- child
JField(`obj`, JString(obj1)) <- child
} yield (subject1, obj1)
我正在尝试创建一个函数来解析我的记录,当我调用一个函数与对它进行硬编码时,我得到了两种不同的行为:
我正在使用:
import org.json4s.JsonAST.{JString, JField, JObject, JArray}
import org.json4s.jackson.JsonMethods._
val parsed = parse("""{"timestamp":"2016-06-02 13:40:16,772","tableName":"stg_mde_campaign_master","dbName":"stg_bankrtl_mde","owner":"hive","location":"null"}""")
val output = for {
JObject(child) <- parsed
JField("timestamp", JString(subject1)) <- child
JField("tableName", JString(obj1)) <- child
} yield (subject1,obj1)
会输出(我想要的):
output: List[(String, String)] = List((2016-06-02 13:40:16,772,stg_mde_campaign_master)
但是当我将它转移到一个函数时,我得到:
def getSubOb(record: String, subject:String, obj:String): List[(String, String)] = {
val parsed = parse(record)
val output: List[(String, String)] = for {
JObject(child) <- parsed
JField(subject, JString(subject1)) <- child
JField(obj, JString(obj1)) <- child
} yield (subject1, obj1)
output
}
val something = getSubOb("""{"timestamp":"2016-06-02 13:40:16,772","tableName":"stg_mde_campaign_master","dbName":"stg_bankrtl_mde","owner":"hive","location":"null"}""", "timestamp", "tableName")
输出行为很奇怪:
something: List[(String, String)] = List((2016-06-02 13:40:16,772,2016-06-02 13:40:16,772), (2016-06-02 13:40:16,772,stg_mde_campaign_master), (2016-06-02 13:40:16,772,stg_bankrtl_mde), (2016-06-02 13:40:16,772,hive), (2016-06-02 13:40:16,772,null), (stg_mde_campaign_master,2016-06-02 13:40:16,772), (stg_mde_campaign_master,stg_mde_campaign_master), (stg_mde_campaign_master,stg_bankrtl_mde), (stg_mde_campaign_master,hive), (stg_mde_campaign_master,null), (stg_bankrtl_mde,2016-06-02 13:40:16,772), (stg_bankrtl_mde,stg_mde_campaign_master), (stg_bankrtl_mde,stg_bankrtl_mde), (stg_bankrtl_mde,hive), (stg_bankrtl_mde,null), (hive,2016-06-02 13:40:16,772), (hive,stg_mde_campaign_master), (hive,stg_bankrtl_mde), (hive,hive), (hive,null), (null,2016-06-02 13:40:16,772), (null,stg_mde_campaign_...
您在 unapply
上有一个细微的错误。
模式匹配左侧的小写术语被视为变量。 所以一切都匹配并绑定在那里。
您可以像在“变量名”中那样使用反引号来告诉 Scala 它不是要绑定的变量,而是匹配模式左侧要匹配的值。
参见:lowercased variables in pattern matching
这应该可以正常工作:
def getSubOb(record: String, subject:String, obj:String): List[(String, String)] = for {
JObject(child) <- parse(record)
JField(`subject`, JString(subject1)) <- child
JField(`obj`, JString(obj1)) <- child
} yield (subject1, obj1)