如何在scala spark play中读取和修改json文件

时间:2016-10-17 15:59:57

标签: json scala playframework

我想读取一个JSON文件并创建一个类/对象,它保存每个JSON的向量/记录中的所有标签和值。然后我想修改一些值(或JSON结构)并使用play / spark / scala将此修改后的JSON文件发送到Http请求。

那么如何用json的值填充我的类的变量?

例如,我有这个JSON文件

   [
  {
    "ser": 345,
    "City": "New York",
    "Gen": 1
  },
  {
    "ser": 55,
    "City": "New York",
    "Gen": 2
  },
  {
    "ser": 19,
    "City": "New York",
    "Gen": 3
  }
 ]

我的目标是创建一个像这样的类

class Book(ser:Integer, city:String, Gen:Integer)
{
   //TODO
}

从json中获取文件中所有记录的ser,city和gen的每个值。 比我想修改json的结构或值,保存并用新文件回答Http请求。

3 个答案:

答案 0 :(得分:2)

假设你有这门课程

case class Book(ser: Int, city: String, gen: Int)

您可以通过实现格式化程序,使用Play的JSON序列化/反序列化来执行JSON转换:

implicit val bookFormat: Format[Book] = {
  ((JsPath \ "ser").format[Int] and
    (JsPath \ "City").format[String] and
    (JsPath \ "Gen").format[Int]
    ) (Book.apply, unlift(Book.unapply))
}

// returns a sequence of Book objects
val books = Json.parse(bookJson).as[Seq[Book]]
// modify your books...
(...)
// convert back to Json
val json = Json.toJson(books)

答案 1 :(得分:0)

如果您没有为项目添加更多依赖项,因为您已经在使用Play,您应该查看Play's json serialization / deserialization capabilities

答案 2 :(得分:0)

约瑟夫我在这里写的是因为更好。

好的,现在我创建了一个采用json的类(使用format方法)。我有seq,我可以做这样的事情:

books(9).city //return the city's value of the seq Book in 9 position of the seq

好的,现在我想用这个结构创建一个新的Json:

[ { "label": [1,2,3] //that is the Gen value, 
     "values": [ 
                 { "label":"New York" 
                   "values":["200","10","66"]  //is the ser about all Gen (for example 200 is ser is for label/gen 1 .. 10 is for label/gen 2 etc.
                 },
                { "label":"London" 
                  "values":["500","150","46"] 
                }, 
                { "label":"London" 
                  "values":["500","150","46"] 
                }, 
                .
                . 
                . 
                . 
                . 
               ] 
  } 
]

这与JSON输入的结构不同。我认为创建这个新类可能会有所帮助:

class New_book(
label_gen:List[String], 
values_gen:List[Libri], 
label:String, 
values:List[Int]  
 )

然后我想用这本书的seq填充这个新课(就是这样: “val books = Json.parse(JsonString).as [Seq [Libri]]”如果你还记得的话。)

在此之后,我将用spark来查询新的Json,然后回答Http请求。

我希望我现在明白了:D