Saturday, June 6, 2020

Parse JSON data in Pure Scala

First Way:

Perquisite:
Add below dependencies in build.sbt
//************************************************************
libraryDependencies += "net.liftweb" %% "lift-json" % "3.4.0"
libraryDependencies += "io.spray" %% "spray-json" % "1.3.5"
//***************************************************************
import scala.util.parsing.json.JSON
object test1 extends App {/* Give location of any type of json file*/

  val input_file = "json.json"  val json_content = scala.io.Source.fromFile(input_file).mkString
  val json_data = JSON.parseFull(json_content)
  println(json_data)

}

File name: json.json
{
  "glossary": {
    "title": "example glossary",
    "GlossDiv": {
      "title": "S",
      "GlossList": {
        "GlossEntry": {
          "ID": "SGML",
          "SortAs": "SGML",
          "GlossTerm": "Standard Generalized Markup Language",
          "Acronym": "SGML",
          "Abbrev": "ISO 8879:1986",
          "GlossDef": {
            "para": "A meta-markup language, used to create markup languages such as DocBook.",
            "GlossSeeAlso": ["GML", "XML"]
          },
          "GlossSee": "markup"
        }
      }
    }
  }
}


Second Way:

import scala.io._
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.scala.DefaultScalaModule
import com.fasterxml.jackson.module.scala.experimental.ScalaObjectMapper

object Main {
  def main(args: Array[String]): Unit = {
    val filename = args.head
    // read    println(s"Reading ${args.head} ...")
    val json = Source.fromFile(filename)
    // parse    val mapper = new ObjectMapper() with ScalaObjectMapper
    mapper.registerModule(DefaultScalaModule)
    val parsedJson = mapper.readValue[Map[String, Object]](json.reader())
    println(parsedJson)
  }
}

Note: pass filename with Absolute path as a argument.
//Output
Reading C:/Users/admin/Desktop/JSON_FOLDER/Scala_Json/json.json ...
Map(glossary -> Map(title -> example glossary, GlossDiv ->
Map(title -> S, GlossList -> Map(GlossEntry -> 
Map(ID -> SGML, Acronym -> SGML, GlossDef ->
Map(para -> A meta-markup language, 
used to create markup languages such as DocBook., GlossSeeAlso -> List(GML, XML)),
SortAs -> SGML, GlossSee -> markup, Abbrev -> ISO 8879:1986, GlossTerm ->
Standard Generalized Markup Language)))))


Third Way:

import net.liftweb.json.DefaultFormats
import net.liftweb.json._

// a case class to match the JSON datacase class EmailAccount(
                         accountName: String,
                         url: String,
                         username: String,
                         password: String,
                         minutesBetweenChecks: Int,
                         usersOfInterest: List[String]
                       )

object ParseJsonArray extends App {
  implicit val formats = DefaultFormats

  // a JSON string that represents a list of EmailAccount instances  val jsonString =""" 
   {      "accounts": [    { "emailAccount": {      "accountName": "GMail",    
  "username": "divyanshu.singh@company.com",      "password": "@12345",     
 "url": "www.gmail.com",      "minutesBetweenChecks": 1,     
 "usersOfInterest": ["Divyanshu", "shekhar", "singh"]    }},  
  { "emailAccount": {      "accountName": "Gmail",   
   "username": "singh.shekhar@gmail.com",      "password": "2345678",    
  "url": "www.gmail.com",      "minutesBetweenChecks": 1,    
  "usersOfInterest": ["DSS", "Dss1"]    }}]}    """
  // json is a JValue instance  val json = parse(jsonString)
  val elements = (json \\ "emailAccount").children
  for (acct <- elements) {
    val m = acct.extract[EmailAccount]
    println(s"Account: ${m.url}, ${m.username}, ${m.password}")
    println(" Users: " + m.usersOfInterest.mkString(","))
  }
}
//Output//Account: www.gmail.com, divyanshu.singh@company.com, @12345
// Users: Divyanshu,shekhar,singh
//Account: www.gmail.com, singh.shekhar@gmail.com, 2345678
// Users: DSS,Dss1


No comments:

Post a Comment