调用JSONObject.getString("Value")从JSON字符串中无法取值求助
问题分析与解决方案
首先得说清楚,你调用JSONObject.getString("Value")拿不到结果,核心原因有两个:
- 你的JSON最外层是数组结构(用
[]包裹),不是单个JSONObject,直接按对象解析肯定找不到对应内容; - 你的JSON数据里根本没有名为"Value"的字段,自然调用这个方法返回不了任何结果。
第一步:先理清你的JSON结构
先把你给出的JSON整理成更清晰的格式(方便看层级):
[ { "$id": "1", "Blocks": [ { "$id": "2", "Thing": { "$ref": "1" }, "Id": 70020, "Index": 6, "PreviousHash": "12BF3BAA7E8B4055D0FD7070FB53B217EE2F427E52B7BBE8F7434194E1C04B", "Timestamp": "2018-03-30T17:13:41.99", "Hash": "676F1147C73964A1125F374EE9DA58469B25C67F1A70C8DCBC2B8B7695E7416", "Status": "Valid", "ThingId": 6021 } ], "Id": 6021, "Created": "2018-01-01T00:00:00", "Issuer": "Islamic University", "Program": "Elecrical Eng", "DateAwarded": "2000-01-01T00:00:00..." } ]
可以看到:
- 最外层是数组,里面包含1个根对象;
- 根对象里有
Issuer、Program、Blocks等字段; Blocks又是一个数组,里面存着具体的区块数据。
第二步:正确获取字段的代码示例
假设你想用Java的org.json库获取Issuer或者区块的Hash值,代码可以这么写:
// 假设你的原始JSON字符串是jsonStr String jsonStr = "[ { \"$id\": \"1\", \"Blocks\": [ { \"$id\": \"2\", \"Thing\": { \"$ref\": \"1\" }, \"Id\": 70020, \"Index\": 6, \"PreviousHash\": \"12BF3BAA7E8B4055D0FD7070FB53B217EE2F427E52B7BBE8F7434194E1C04B\", \"Timestamp\": \"2018-03-30T17:13:41.99\", \"Hash\": \"676F1147C73964A1125F374EE9DA58469B25C67F1A70C8DCBC2B8B7695E7416\", \"Status\": \"Valid\", \"ThingId\": 6021 } ], \"Id\": 6021, \"Created\": \"2018-01-01T00:00:00\", \"Issuer\": \"Islamic University\", \"Program\": \"Elecrical Eng\", \"DateAwarded\": \"2000-01-01T00:00:00\" } ]"; // 1. 先把JSON字符串解析成JSONArray(因为最外层是数组) JSONArray jsonArray = new JSONArray(jsonStr); // 2. 取出数组里的第一个根对象(你的数组只有1个元素) JSONObject rootObj = jsonArray.getJSONObject(0); // 3. 获取根对象里的Issuer字段 String issuer = rootObj.getString("Issuer"); System.out.println("发证人:" + issuer); // 输出 Islamic University // 4. 如果要获取Blocks数组里的区块Hash值 JSONArray blocksArray = rootObj.getJSONArray("Blocks"); JSONObject blockObj = blocksArray.getJSONObject(0); String blockHash = blockObj.getString("Hash"); System.out.println("区块哈希:" + blockHash);
关键注意点
- 字段名要严格匹配:JSON是大小写敏感的,比如
Program不能写成program; - 如果你确实需要获取"Value"字段,得先确认数据源是否正确——要么是字段名拼写错误(比如是不是
value小写),要么是数据源本身就没有这个字段。
内容的提问来源于stack exchange,提问作者Danish Sarwar
相关产品推荐
相关产品推荐

