Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中,将带有数组的json字符串转换为平面键的最佳方法_Java_Json - Fatal编程技术网

在Java中,将带有数组的json字符串转换为平面键的最佳方法

在Java中,将带有数组的json字符串转换为平面键的最佳方法,java,json,Java,Json,我有一个JSON文件,其结构如下 [ { "type":[ "blog", "article", "pressrelease" ], "states":[ "scheduled", "published" ], "roles":[ "editor", "admin" ], "

我有一个JSON文件,其结构如下

    [
   {
      "type":[
         "blog",
         "article",
         "pressrelease"
      ],
      "states":[
         "scheduled",
         "published"
      ],
      "roles":[
         "editor",
         "admin"
      ],
      "actions":[
         "review",
         "delete"
      ]
   },
   {
      "type":[
         "blog",
         "article",
         "pressrelease"
      ],
      "states":[
         "draft",
         "review"
      ],
      "roles":[
         "editor",
         "admin"
      ],
      "actions":[
         "submit",
         "delete"
      ]
   },
   {
      "type":[
         "blog",
         "article"
      ],
      "states":[
         "draft",
         "review"
      ],
      "roles":[
         "author"
      ],
      "actions":[
         "submit"
      ]
   },
   {
      "type":[
         "pressrelease"
      ],
      "states":[
         "draft",
         "review"
      ],
      "roles":[
         "pr",
         "prm"
      ],
      "actions":[
         "submit"
      ]
   },
   {
      "type":[
         "pressrelease"
      ],
      "states":[
         "scheduled",
         "published"
      ],
      "roles":[
         "prm"
      ],
      "actions":[
         "review",
         "delete"
      ]
   }
]
我需要为给定场景编写一个方法,该方法将根据上述json返回操作,如

getActions(type, state, role){
}
我计划使用GSON将json转换为Action类对象列表,然后通过使用少量for循环处理json来构建一个静态映射,其中key为type.state.role,value为Action列表。 我的地图会有

"blog.scheduled.editor" : ["review", "delete"]
"blog.scheduled.admin" : ["review", "delete"]
"blog.published.editor" : ["review", "delete"]

因此,在getActionas方法中,我可以通过从输入值创建一个键来轻松返回操作


我不确定这是否是正确的实现,或者是否有实用程序可以完成这项工作。

您的思路是正确的,但我建议使用树而不是地图,因为它是此类数据更自然的表示形式

按如下方式构建您的树:

* [Root]
|___ blog
|   |___ published
|   |   |___ editor
|   |   |   |___ review
|   |   |   |___ delete
|   |   |
|   |   |___ admin
|   |   |   |___ review
|   |   |   |___ delete
|   |   |
|   |
|   |___ scheduled
|   |   |___ admin
|   |   |   |___ delete
|   |   |   |___ review
|   |   |
|   |   |___ editor
|   |   |   |___ review
|   |   |   |___ delete
|   |   |
|   |
|
|___ pressrelease
|   |___ scheduled
|   |   |___ admin
|   |   |   |___ delete
|   |   |   |___ review
(I spend far too much time on that ASCII tree ...)
然后,您可以从一个节点走到另一个节点,然后检查子节点


通过这种方式,您还可以检查博客条目上可能出现的状态,并且(如果您以不同的方式重新排序或创建树),您可以检查管理员可以对文章执行的操作。

数据结构应该是一棵树。我不想为GSON操心,因为您必须完全匹配JSON的结构才能使其工作。使用能够解析文档并允许您访问所有元素的
org.json
-库(或类似库)。使用Jackson ObjectMapper反序列化原始数据(因此仅列出和映射)-->。如果需要,还可以使用它使用完整的数据绑定进行反序列化(但需要编写精确的映射类)
* [Root]
|___ blog
|   |___ published
|   |   |___ editor
|   |   |   |___ review
|   |   |   |___ delete
|   |   |
|   |   |___ admin
|   |   |   |___ review
|   |   |   |___ delete
|   |   |
|   |
|   |___ scheduled
|   |   |___ admin
|   |   |   |___ delete
|   |   |   |___ review
|   |   |
|   |   |___ editor
|   |   |   |___ review
|   |   |   |___ delete
|   |   |
|   |
|
|___ pressrelease
|   |___ scheduled
|   |   |___ admin
|   |   |   |___ delete
|   |   |   |___ review
(I spend far too much time on that ASCII tree ...)