如何从Json中提取值

22

我从服务器获取到一个类似下面这样的响应字符串:

{
  "name": "Json",
  "detail": {
    "first_name": "Json",
    "last_name": "Scott",
    "age": "23"
  },
  "status": "success"
}

我想获取“First name”的值。我该怎么做?

10个回答

21

看看这段代码,这是我在我的应用程序中使用的

String data="{'foo':'bar','coolness':2.0, 'altitude':39000, 'pilot':{'firstName':'Buzz','lastName':'Aldrin'}, 'mission':'apollo 11'}";

我像这样检索

JSONObject json = (JSONObject) JSONSerializer.toJSON(data);        
    double coolness = json.getDouble( "coolness" );
    int altitude = json.getInt( "altitude" );
    JSONObject pilot = json.getJSONObject("pilot");
    String firstName = pilot.getString("firstName");
    String lastName = pilot.getString("lastName");

    System.out.println( "Coolness: " + coolness );
    System.out.println( "Altitude: " + altitude );
    System.out.println( "Pilot: " + lastName );

11
你用了哪个库? - Parzifal
1
顺便说一下:这不是有效的数据 JSON 字符串。你必须使用 " " 而不是 ' '。可以在此网站上验证 http://jsonlint.com/。 - darewreck
你使用了哪个库来进行JSON序列化? - Suresh
@KarenGonzalez 看起来这个链接已经失效了。<a>java2s.com/Code/Jar/j/Downloadjsonlibjar.htm</a> - Suresh
这个解决方案需要两个依赖项。我认为user3251882的解决方案更好。他/她还指定了单个导入(一个好的库)。 - Stefan
显示剩余2条评论

14

将我的代码粘贴在这里,这应该会有所帮助。它显示可用的软件包。

import org.json.JSONException;
import org.json.JSONObject;

public class extractingJSON {

    public static void main(String[] args) throws JSONException {
        // TODO Auto-generated method stub

        String jsonStr = "{\"name\":\"SK\",\"arr\":{\"a\":\"1\",\"b\":\"2\"}}";
        JSONObject jsonObj = new JSONObject(jsonStr);
        String name = jsonObj.getString("name");
        System.out.println(name);

        String first = jsonObj.getJSONObject("arr").getString("a");
        System.out.println(first);

    }

}

9
使用 JSON 解析器。Java 写了很多 JSON 解析器。
http://www.json.org/ 下找到 Java 部分并选择喜欢的解析器。

是的,我很抱歉,我忘记放一个花括号了。请问我应该使用 JSONObject 还是 JSONArray 来检索“first_name”? - Balban
我不是Java程序员,但从文档中可以看出,你可能想要创建一个JSONObject,并使用它的getString()方法来获取特定键的字符串值。如果这个答案对你有帮助,请使用答案左侧的复选框接受它。 - Jasarien
或者接受一个只提供代码而没有解释或帮助你自学的答案。随你喜欢。 ;) - Jasarien

5
如果您不介意增加一个依赖项,您可以使用JsonPath
import com.jayway.jsonpath.JsonPath;

String firstName = JsonPath.read(rawJsonString, "$.detail.first_name");

"

"$"

指定了原始json字符串的根,然后您只需指定要获取的字段的路径。这将始终返回一个字符串。您需要自己进行任何类型转换。

请注意,如果您指定的路径不存在,它会在运行时抛出PathNotFoundException异常。

"

很高兴了解到这个库,非常适合爬取嵌入在网页中的Json数据。 - Franco G

1
String jsonErrorString=((HttpClientErrorException)exception).getResponseBodyAsString();
JSONObject jsonObj=null;
String errorDetails=null;
String status=null;
try {
        jsonObj = new JSONObject(jsonErrorString);
        int index =jsonObj.getString("detail").indexOf(":");
                errorDetails=jsonObj.getString("detail").substring(index);
                status=jsonObj.getString("status");

            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            item.put("status", status);
            item.put("errordetailMsg", errorDetails);

0

如果你收到一个类似于json格式的 response 字符串,你可以这样做:

import org.json.simple.parser.JSONParser;
    
JSONParser parser = new JSONParser();
JSONObject jsonResponse = (JSONObject) parser.parse(response);

然后获取 name

String name = (String) jsonObject.get("name");

获取 firstname

JSONObject detailObject = (JSONObject) jsonObject.get("detail");
String firstname = (String) detailObject.get("first_name");

0
    JSONArray ja = new JSONArray(json);
    JSONObject ob = ja.getJSONObject(0);
    String nh = ob.getString("status");

[ { "status" : "true" } ]

这里的 'json' 是一个字符串,状态是我将从中获取值的键


0

我们可以使用以下代码从JSON对象中获取键名字符串

JsonObject json = new JsonObject(); 
 json.get("key").getAsString();

这将返回不带字符串中的双引号" "的字符串


0
    //import java.util.ArrayList;
    //import org.bson.Document;

    Document root = Document.parse("{\n"
            + "  \"name\": \"Json\",\n"
            + "  \"detail\": {\n"
            + "    \"first_name\": \"Json\",\n"
            + "    \"last_name\": \"Scott\",\n"
            + "    \"age\": \"23\"\n"
            + "  },\n"
            + "  \"status\": \"success\"\n"
            + "}");

    System.out.println(((String) root.get("name")));
    System.out.println(((String) ((Document) root.get("detail")).get("first_name")));
    System.out.println(((String) ((Document) root.get("detail")).get("last_name")));
    System.out.println(((String) ((Document) root.get("detail")).get("age")));
    System.out.println(((String) root.get("status")));

-1
如果您想使用标准库Jackson,您可以读取JSON字符串并将其存储为JsonNode。
final String json = "{\"name\": \"asdf\", \"age\": \"23\", }";
final JsonNode node = new ObjectMapper().readValue(json, JsonNode.class);
System.out.println(jsonNode.findValuesAsText("name"));
    

如果您想将JSON对象存储为Map,则可以使用ObjectNode(它是JsonNode的Map实现)。 您可以按键获取元素,如下所示。

final ObjectNode node = new ObjectMapper().readValue(json, ObjectNode.class);
if (node.has("name")) {
    System.out.println("name: " + node.get("name"));
}
    

如果您想将JSON对象存储为数组,则可以使用ArrayNode(它是JsonNode的数组实现)。您可以按索引获取元素,如下所示。
final ObjectNode node = new ObjectMapper().readValue(json, ObjectNode.class);
System.out.println("name: " + node.get(0));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接