2016-07-28 7 views
0

Ich versuche, eine Funktion zu erstellen, um meine Aufzeichnungen zu analysieren, und ich bin immer zwei verschiedene Verhaltensweisen, wenn ich eine Funktion vs hart nennen Codierung es:Scala Parsing JSON anders verhalten in einer Funktion

Ich verwende:

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) 

will Ausgang (was ich will):

output: List[(String, String)] = List((2016-06-02 13:40:16,772,stg_mde_campaign_master) 

aber wenn ich es auf eine Funktion übertragen erhalte ich:

Der Ausgang wirkt sehr seltsam:

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_... 
+0

Beitrag einige fahrbare Code. – Falmarri

+0

Die Importanweisungen hinzugefügt, aber alles andere ist ausführbar – theMadKing

Antwort

1

Sie haben einen subtele Fehler auf den unapply.

Begriffe auf der linken Seite einer Musterübereinstimmung werden als Variablen behandelt. Also alles passt und ist dort gebunden.

Sie können Backticks wie in `Variablenname` verwenden, um Scala mitzuteilen, dass auf der linken Seite des Musters keine Variable gebunden werden soll, sondern ein Wert, der angepasst werden soll.

sehen: lowercased variables in pattern matching

Dies sollte wie vorgesehen:

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)