【问题标题】:Scala Play JSON: Turn a hashmap into json object instead of arrayScala Play JSON:将哈希图转换为 json 对象而不是数组
【发布时间】:2021-04-07 10:51:33
【问题描述】:

对于给定的HashMap结构:

scala.collection.immutable.Map[scala.Option[java.util.UUID], scala.collection.immutable.List[crm.v1.auto.generated.customapis.CustomapisPublic]]

Json.toJson 产生这个:

[
    [
        "bb2b5475-8f27-4dd4-9221-05904177a666",
        [
            {
                "id": "5e700dab-e352-47d5-8ad8-0d9e16db8fbc",
                "time": 1616500566442,
                "isGroup": true,
                "name": "rapidx",
                "parentId": "bb2b5475-8f27-4dd4-9221-05904177a666",
                "projectId": "d531e915-afb0-42e9-9c90-831f0413794e",
                "teamId": "a03339d4-4ccc-48ea-8bd9-b506ad83c492"
            },
            {
                "id": "5287f6bd-2f55-4232-9064-a989ae5926f3",
                "time": 1616503457651,
                "isGroup": true,
                "name": "User",
                "parentId": "bb2b5475-8f27-4dd4-9221-05904177a666",
                "projectId": "d531e915-afb0-42e9-9c90-831f0413794e",
                "teamId": "a03339d4-4ccc-48ea-8bd9-b506ad83c492"
            }
        ]
    ],
    [
        "5287f6bd-2f55-4232-9064-a989ae5926f3",
        [
            {
                "id": "db0f59ea-fbf0-4024-ad54-04ea387223b0",
                "time": 1616569959967,
                "description": "Post Daily data",
                "isGroup": true,
                "name": "Post Daily data",
                "parentId": "5287f6bd-2f55-4232-9064-a989ae5926f3",
                "projectId": "d531e915-afb0-42e9-9c90-831f0413794e",
                "teamId": "a03339d4-4ccc-48ea-8bd9-b506ad83c492"
            },
            {
                "id": "325c3d1f-d2bb-46b2-a708-db26484607c2",
                "time": 1616570029306,
                "code": "Future{\n    Results.Ok(“Patch user data working successfully”)\n}",
                "description": "patch user data",
                "isGroup": false,
                "name": "patch user data",
                "parentId": "5287f6bd-2f55-4232-9064-a989ae5926f3",
                "projectId": "d531e915-afb0-42e9-9c90-831f0413794e",
                "supportedMethods": [
                    "get",
                    "post",
                    "patch",
                    "delete"
                ],
                "teamId": "a03339d4-4ccc-48ea-8bd9-b506ad83c492"
            },
            {
                "id": "61c392b5-b482-4b2b-be2c-e94f40dfef2c",
                "time": 1616570221882,
                "code": "Future{Results.Ok(“Add config working successfully”)}",
                "description": "addConfig",
                "isGroup": false,
                "name": "addConfig",
                "parentId": "5287f6bd-2f55-4232-9064-a989ae5926f3",
                "projectId": "d531e915-afb0-42e9-9c90-831f0413794e",
                "teamId": "a03339d4-4ccc-48ea-8bd9-b506ad83c492"
            }
        ]
    ]]

虽然我想要他的东西:

{
 "uuid-1": [{...object-1...}, ...],
 "uuid-2": [{...object 1...}, ...],
 "uuid-n": [{...object 1...}, ...],
 null: [{...object 1}, .... ]
}

非常感谢任何提示。

【问题讨论】:

  • 您确定要null 密钥吗? JSON 允许吗?
  • 是的,我检查过,似乎 Json 不允许,因此根据您的建议,需要对基础地图进行进一步修改。现在 map 的键不是 Option[UUID] 类型,而是 String 类型。

标签: scala play-json


【解决方案1】:

PlayJson 知道如何使用 Map[String, SomethingThatHasAWrites],因此您可以先将密钥转换为字符串。

虽然不知道如何处理 null,这似乎是个坏主意,也许更改为虚拟值?

 Json.toJson(data.map { 
    case (Some(key), value) => key.toString -> value 
    case (None, value)      => "missing"    -> value
 })

【讨论】:

  • 是的,我把空值变成了root
【解决方案2】:

顺便说一句,我尝试了类似于 @Thilo 刚刚建议的方法。

我在我的组后面添加了一个地图,并将键类型 Option[UUID] 变成了字符串。

mapField.map(a  => (a._1.map(_.toString).getOrElse("root"), a._2))

我也意识到 PlayJson 在这里真的很聪明,当有空值时,它会选择基于列表/数组的结构。现在,当没有机会遇到空值代替键时,它选择了树/对象结构。

也许,我猜 PlayJson 在有非基于字符串的类型代替 HashMap 键时会选择列表结构,如果 HashMap 键的类型是 Number 或 String,则选择 Treee 结构。

新结构如下所示:

{
    "root": [
        {....},
        {....},
        {....}
    ],
    "db0f59ea-fbf0-4024-ad54-04ea387223b0": [
        {...}
    ],

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 2018-04-21
    • 2011-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多