2016-10-17 56 views
-1

我想讀取一個JSON文件並創建一個類/對象,保存每個JSON的矢量/記錄的所有標籤和值。然後,我想修改一些值(或JSON結構)並使用play/spark/scala將此修改後的JSON文件轉換爲Http請求。我如何讀取和修改斯卡拉json文件火花播放

那麼如何用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 
} 

這需要SER,市,根的每個值一個班,從JSON所有文件中的記錄。 比我想修改json的結構或值,保存並回答新文件到一個Http請求。

回答

2

假設你有這個類

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

您可以使用執行JSON轉換Play的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) 
+0

謝謝! 另一個問題,我的Json有更多的變量,然後3(不僅城市,服務,但地址錢等)。我可以從json只取3-4個變量嗎?或者我應該初始化所有變量? – Mozzer

+0

由於'Format'在上面實現,它只從JSON中指定三個條目並忽略其餘部分。所以如果你只需要這三個,你就沒事。但是你也必須知道,當序列化你的對象時,只有這三個值將出現在生成的JSON中,並且它不會與原始的JSON相同。 – Josef

+0

對不起,你能解釋一下這個(Book.apply,unlift(Book.unapply)? – Mozzer

0

Josef我在這裏寫作是因爲更好。

好的,所以現在我創建了帶json的類(使用format方法)。我有序列,我可以做這樣的事情:

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書= Json.parse(JsonString)。至於[序列[Libri]]「如果你還記得的話)。

在此之後,我將使用spark來查詢新的Json,並用它回答Http請求。我想我現在明白了:D

+0

新類不反映JSON的結構。我假設'Libri'類已經表示內部'values'數組的元素。那麼'label'和'values'成員就沒有必要了。 – Josef

+0

我不明白...對不起,values_gen是List [Book]。 現在,我該如何進行此轉換? – Mozzer

+0

你能告訴我嗎? – Mozzer