2016-10-19 12 views
-2

Ich versuche eine Karte [String, ANY] zu konvertieren, die jeder auch manchmal eine Map [String, Alles] enthält Format und so weiter, in Json String.Convert Karte zu JSON-String-Format

Ich habe diese externe Bibliothek http://json4s.org/ gefunden, aber erstaunt mich, dass Scala-Kern keine native Bibliothek enthält, um dies zu erreichen.

Irgendeine Idee?

Grüße.

+0

es hat eine, namens JSONObject, aber es ist begrenzt. Sie könnten Ihre eigenen rollen. http://albertech.blogspot.com/2017/02/convert-nested-map-and-list-data.html – jar

Antwort

1

Gut JSON ist ein Austauschformat (wenn auch ein populäres), aber dann auch XML usw. Die Kernbibliothek sollte sich wohl nicht damit beschäftigen, sich mit einer langen Liste von Datenformaten zu befassen - zumindest ist das so Was ich verstehe, ist der Grund, solche Unterstützung im Scala-Kern zu beschränken, wie in anderen Sprachen.

Es gibt durchaus ein paar Bibliotheken, die Sie dies helfen wird, zu erreichen.

Ich benutze derzeit Argonaut für alle Dinge JSON in Scala-Projekten, es sei denn, ich verwende Play, in diesem Fall bietet es auch ziemlich gute JSON-Unterstützung. Schauen Sie sich Argonaut an, Sie können damit ganz leicht erreichen, was Sie wollen.

+0

Danke endlich benutze ich json4s funktioniert gut! – paul

1

Soweit ich verstand ich dachte, dass Sie Ihre benutzerdefinierte Implementierung für Json verwenden, das ist: Map[String, Any]

Hier ist also benutzerdefinierte Implementierung von Funktion, die für String Ihrer Karte

def show(json: Map[String, Any]) : String = { 

    def parse(elem: (String, Any)): String = elem match { 
    case (a: String, b: Map[String, _]) => "\"" + a + "\"" + ":" + show(b) + "" 
    case (a: String, b: Boolean) => "\"" + a + "\"" + ":" + b.toString 
    case (a: String, b: Int) => "\"" + a + "\"" + ":" + b.toString 
    case (a: String, b: Double) => "\"" + a + "\"" + ":" + b.toString 
    case (a: String, b: String) => "\"" + a + "\"" + ":\"" + b + "\"" 
    } 

    val assocs = json.map { 
    case(key, value) => parse((key,value)) 
    } 

    "{\n" + assocs.mkString(", \n")+ "}" 

} 

zurück solche Karte:

val mapJson = Map("root" -> 
    Map("field1" -> 1, 
     "field2" -> Map("field1" -> true, 
     "field2" -> 2.03), 
     "field3" -> "Test")) 

es druckt:

String = { 
"root":{ 
"field1":1, 
"field2":{ 
"field1":true, 
"field2":2.03}, 
"field3":"Test"}} 
+0

Danke, aber nicht bereit, das Rad neu zu erfinden, danke trotzdem – paul