首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Json对象转换为hashmap?

将Json对象转换为hashmap?
EN

Stack Overflow用户
提问于 2018-11-05 07:17:57
回答 2查看 583关注 0票数 0

我有一个string对象,表示为网络任务返回的json对象。我需要将其转换为地图(或HashMap)。我一直在使用gson,但一直不成功。这是json字符串(请原谅缩进,因为我必须手动添加换行空格):

代码语言:javascript
复制
{
"plans":{
"Ankle Recovery":{
"StartDate":"09/24/2018",
"Progress":0.6666666666666666,
"Tasks":[
        {
            "date":"10/16/2018",
            "amount":200,
            "task":"ice ankle for 30 min",
            "completed":true,
            "requirementType":"steps"},
            {
                "date":"10/17/2018",
                "amount":200,
                "task":"ice ankle for 30 min",
                "completed":true,
                "requirementType":"steps"
            },
            {
                "date":"10/18/2018",
                "amount":200,
                "task":"ice ankle for 30 min",
                "completed":false,
                "requirementType":"steps"
            }
],
"Username":"email@site.com",
"Doctor":"Mike Michaels",
"EndDate":"12/24/2018"}},
"status":true
}

这是我用来进行转换的代码:

代码语言:javascript
复制
private Map<String, String> plans;
plans = new Gson().fromJson(result, new TypeToken<Map<String, String>>() {}.getType());

两者都没有起到作用。我在Stack Overflow上尝试了一些不同的解决方案,但到目前为止都没有成功。

我还抛出了一个我不太理解的异常:

代码语言:javascript
复制
 com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected a string but was BEGIN_OBJECT at line 1 column 11

(第11列正好在“AnkleRecovery”中第一个引号之前)

如果可能的话,我想使用简单的gson来实现这个功能。但我对其他解决方案持开放态度。

EN

回答 2

Stack Overflow用户

发布于 2018-11-05 07:58:16

您发布的JSON无效,第3行:

代码语言:javascript
复制
"Ankle Recovery" : {
//              / \
//  this is what you are missing

这个工具将帮助您验证JSON结构并对其进行格式化:https://jsonlint.com/

现在来看实际的问题。您的JSON具有以下结构:

代码语言:javascript
复制
{
    "plans": Object,
    "status": Boolean,
}

这两个都不是字符串(对象!=字符串,布尔!=字符串)。

这样的结构不能映射到Map<String, String>,因为这要求值是字符串。

您将需要创建多个POJO来定义您的结构,然后映射到这些,例如:

代码语言:javascript
复制
class Project {
    public Map<String,Plan> plans;
    public Boolean status;
}

class Plan {
    public String StartDate;
    public Double Progress;
    public List<Task> tasks;
    ...
}

class Task {
    ...
}
票数 1
EN

Stack Overflow用户

发布于 2018-11-05 08:29:38

免责声明...

我总是考虑使用一个或多个POJO,如果可能的话,这些POJO可以用于表示数据结构。

如果没有更多的信息,就不可能知道像Ankle Recovery这样的密钥是否稳定,或者它们是否可能改变。

"A“可能的解决方案

通常,JSON采用键/值对的形式,其中的值可能是另一个JSON对象、数组或其他值的列表,因此您“可以”直接处理该结构,例如...

代码语言:javascript
复制
String text = "{\n"
        + "  \"plans\":{\n"
        + "    \"Ankle Recovery\":{\n"
        + "      \"StartDate\":\"09/24/2018\",\n"
        + "      \"Progress\":0.6666666666666666,\n"
        + "      \"Tasks\":[\n"
        + "        {\n"
        + "          \"date\":\"10/16/2018\",\n"
        + "          \"amount\":200,\n"
        + "          \"task\":\"ice ankle for 30 min\",\n"
        + "          \"completed\":true,\n"
        + "          \"requirementType\":\"steps\"\n"
        + "        },\n"
        + "        {\n"
        + "          \"date\":\"10/17/2018\",\n"
        + "          \"amount\":200,\n"
        + "          \"task\":\"ice ankle for 30 min\",\n"
        + "          \"completed\":true,\n"
        + "          \"requirementType\":\"steps\"\n"
        + "        },\n"
        + "        {\n"
        + "          \"date\":\"10/18/2018\",\n"
        + "          \"amount\":200,\n"
        + "          \"task\":\"ice ankle for 30 min\",\n"
        + "          \"completed\":false,\n"
        + "          \"requirementType\":\"steps\"\n"
        + "        }\n"
        + "      ],\n"
        + "      \"Username\":\"email@site.com\",\n"
        + "      \"Doctor\":\"Mike Michaels\",\n"
        + "      \"EndDate\":\"12/24/2018\"\n"
        + "    }\n"
        + "  },\n"
        + "  \"status\":true\n"
        + "}";

Gson gson = new Gson();
Map<String, Object> fromJson = gson.fromJson(text, Map.class);
Map<String, Object> plans = (Map<String, Object>) fromJson.get("plans");
Map<String, Object> recovery = (Map<String, Object>) plans.get("Ankle Recovery");
List<Map<String, Object>> tasks = (List<Map<String, Object>>) recovery.get("Tasks");
for (Map<String, Object> taks : tasks) {
    for (Map.Entry<String, Object> entry : taks.entrySet()) {
        System.out.println(entry.getKey() + " = " + entry.getValue());
    }
}

现在,这将为您提供以下输出:

代码语言:javascript
复制
date = 10/16/2018
amount = 200.0
task = ice ankle for 30 min
completed = true
requirementType = steps
date = 10/17/2018
amount = 200.0
task = ice ankle for 30 min
completed = true
requirementType = steps
date = 10/18/2018
amount = 200.0
task = ice ankle for 30 min
completed = false
requirementType = steps

话虽如此,您自己的解析可能要复杂得多,必须检查某些键是否存在,并根据需要采取适当的操作

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53146446

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档