Scala playfamework-如何将一个JSON字符串与另一个字符串包装在一起?

时间:2018-07-26 11:11:48

标签: json scala playframework

我有来自两个不同API端点的JSON数据。第一个JSON包含有关商店的数据,第二个JSON包含有关交易(销售)的数据。

对于每个商店ID,我都会获得一系列交易并将其解析为JsValue。因此,我有一个store Jsvalue代表该商店,一个transactions JsValue代表商店的交易数组。然后我将JsValues字符串化:

(Json.stringify(storeJsValue), Json.stringify(transactionsJson))

上述Array [(String,String)]的字符串化JsValues的打印结果:

({"store_id":"01","name":"Store_1"}, [{"saleId": 12, "name": "New name1", "saleType": "New Type1"]}, {"saleId": 222, "name": "Some name1", "saleType": "SomeType5"})
({"store_id":"02","name":"Store_2"}, [{"saleId": 123, "name": "New name2", "saleType": "New Type2"}])
({"store_id":"03","name":"Store_3"}, [{"saleId": 1234, "name": "New name3", "saleType": "New Type3"}, {"saleId": 333, "name": "Some name3", "saleType": "SomeType3"}])

最后,我想生成一个结果字符串,以便商店数据包装其交易数据,如下所示:

"{store:\"storeJson\",transactions:\"+ transactionsJson + "}"

使用Play Json实现这一目标的最佳方法是什么?

4 个答案:

答案 0 :(得分:2)

一种方法是将json转换为对象,创建一个具有“ store”和“ transactions”属性的新对象,然后再次将其转换为JSON。

这样,您将得到:

{ 
  "store": {
    "store_id":"01",
    "name":"Store_1"
  },
  "transactions": [
    {
        "saleId": 12,
        "name": "New name1",
        "saleType": "New Type1"
    }, 
    {
        "saleId": 222,
        "name": "Some name1", 
        "saleType": "SomeType5"
    }
  ]
}

您的课程:

case class MyClass( store : Store, transactions : Array[Sales]) {
    .....
}

答案 1 :(得分:2)

您有两个json值,可以使用它们创建一个新对象:

    The Ionic CLI will exit. Please check any output above for error details.

答案 2 :(得分:1)

我设法达到了预期的效果。

val store = Json.stringify(storeJsValue)
val transactions = Json.stringify(transactionsJsValue)
val storeWithTransactions: String = s"{store: $store , transactions: $transactions}"

这样,我就得到了一个包含商店及其所有交易数据的字符串。因此,我只是遍历商店,对于每个商店,Id都会从另一个端点获取其交易。然后将storetransactions的字符串化JsValue串联起来,将所得的字符串收集到Array [String]中。

答案 3 :(得分:1)

在Play中,您可以使用Json Reads/Writes助手将case class转换为Json,反之亦然。因此,对于您的示例:

case class Store(store_id: String, name: String)

然后,如果您有一个Json并想将其转换为Store案例类,则需要一个“阅读器”:

val storeReads: Reads[Store] = Json.reads[Store]

此后,您可以将Json的内容读取为String并将其转换为case类(假设storeJson是包含Json内容的val):

val toStoreCaseClass: JsResult[Store] = Json.fromJson[Store](json.parse(storeJson))

如果要将案例类转换为Json,则可以使用写操作:

val storeWrites: OWrites[Store] = Json.writes[Store]

现在假设您拥有类型storeInstance的val Store,可通过以下代码将其转换为Json:

Json.toJson(storeInstance)

您可以对交易执行相同的操作。

好了,现在有了案例类,您可以使用常用的collections命令(例如mapfilter等)将它们变形为所需的格式。您甚至可以拥有一个更通用的案例类,其中包含要实现的格式(具有读/写功能);并进行数据操作,最后将它们转换为Json。