亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將 Json 對象轉換為 hashmap?

將 Json 對象轉換為 hashmap?

忽然笑 2021-12-30 16:20:03
我有一個字符串對象,表示為網絡任務返回的 json 對象。我需要將其轉換為 Map(或 HashMap)。我一直在使用gson,但沒有成功。這是 json 字符串(請原諒縮進,因為我不得不手動添加換行符):{"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 protected]","Doctor":"Mike Michaels","EndDate":"12/24/2018"}},"status":true}這是我用來進行轉換的代碼:private Map<String, String> plans;plans = new Gson().fromJson(result, new TypeToken<Map<String, String>>() {}.getType());既沒有也沒有工作。我在 Stack Overflow 上嘗試了一些不同的解決方案,但到目前為止都沒有成功。我也收到了一個我不太明白的異常: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected a string but was BEGIN_OBJECT at line 1 column 11(第 11 列就在“AnkleRecovery”中的第一個引用之前)如果可能的話,我想使用簡單的 gson 來完成這項工作。但我對替代解決方案持開放態度。
查看完整描述

2 回答

?
慕的地10843

TA貢獻1785條經驗 獲得超8個贊

您發布的 JSON 無效,第 3 行:


"Ankle Recovery" : {

//              / \

//  this is what you are missing

此工具將幫助您驗證 JSON 結構并對其進行格式化:https : //jsonlint.com/


現在到實際問題。您的 JSON 具有以下結構:


{

    "plans": Object,

    "status": Boolean,

}

這些都不是字符串( object != string, boolean != string )。

不能映射到這樣的結構,Map<String, String>因為這要求值是字符串。


您將需要創建多個 POJO 來定義您的結構,然后映射到這些,例如:


class Project {

    public Map<String,Plan> plans;

    public Boolean status;

}


class Plan {

    public String StartDate;

    public Double Progress;

    public List<Task> tasks;

    ...

}


class Task {

    ...

}


查看完整回答
反對 回復 2021-12-30
?
MMTTMM

TA貢獻1869條經驗 獲得超4個贊

免責聲明...

如果可能的話,我總是會使用一個或多個 POJO 進行調查,這些 POJO 可用于表示數據結構。


如果沒有更多信息,就不可能知道像這樣Ankle Recovery的鍵是否穩定,或者它們是否可能會改變。


“A”可能的解決方案

通常,JSON 采用鍵/值對的形式,其中的值可能是另一個 JSON 對象、數組或其他值的列表,因此您“可以”直接處理該結構,例如...


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 protected]\",\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());

    }

}

現在,這會讓你得到...的輸出


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

話雖如此,您自己的解析可能涉及更多,必須檢查某些鍵是否存在并根據需要采取適當的措施


查看完整回答
反對 回復 2021-12-30
  • 2 回答
  • 0 關注
  • 135 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號