【问题标题】:How do I extract value from Json如何从 Json 中提取价值
【发布时间】:2011-11-12 01:18:44
【问题描述】:

我正在从服务器获取响应字符串,如下所示

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

我想获取 First name 的值。我怎样才能做到这一点?提前致谢。

【问题讨论】:

    标签: java json


    【解决方案1】:

    使用 JSON 解析器。有很多用 Java 编写的 JSON 解析器。

    http://www.json.org/

    查看 Java 部分并找到您喜欢的。

    【讨论】:

    • 是的.. 对不起,我忘了放一个大括号。请我使用 JSONObject 或 JSONArray。用于检索"first_name"
    • 我不是 Java 程序员,但从我在文档中看到的内容来看,您可能想要创建一个 JSONObject 并使用它的 getString() 方法来获取特定键的字符串值。如果此答案对您有所帮助。请使用答案左侧的复选标记接受它。
    • 或者接受一个只是转储代码而没有解释的答案,或者尝试帮助您自学。你知道,随便。 ;)
    【解决方案2】:

    查看我在应用程序中使用的代码

    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 );
    

    【讨论】:

    【解决方案3】:

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

    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);
    
        }
    
    }
    

    【讨论】:

      【解决方案4】:

      如果你不介意添加依赖,可以使用JsonPath

      import com.jayway.jsonpath.JsonPath;
      
      String firstName = JsonPath.read(rawJsonString, "$.detail.first_name");
      

      "$" 指定原始 json 字符串的根,然后您只需指定所需字段的路径。这将始终返回一个字符串。您必须自己进行任何投射。

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

      【讨论】:

        【解决方案5】:
        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);
        

        【讨论】:

          【解决方案6】:
              JSONArray ja = new JSONArray(json);
              JSONObject ob = ja.getJSONObject(0);
              String nh = ob.getString("status");
          

          [{ “状态”:“真实” } ]

          'json' 是一个字符串,status 是我从中获取值的键

          【讨论】:

            【解决方案7】:

            我们可以使用下面的方法从 JSON OBJECT 中获取 key 作为字符串

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

            这给出了字符串中没有双引号" "的字符串

            【讨论】:

              【解决方案8】:
                  //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")));
              

              【讨论】:

                【解决方案9】:

                如果你想使用标准库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 对象存储为地图,那么您可以使用 ObjectNode(它是 JsonNode 的 Map 实现)。可以通过key获取元素,如下图。

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

                如果您想将 json 对象存储为 Array,那么您可以使用 ArrayNode(它是 JsonNode 的 Array 实现)。您可以通过索引获取元素,如下所示。

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

                【讨论】:

                  猜你喜欢
                  • 2014-09-13
                  • 1970-01-01
                  • 2021-12-18
                  • 1970-01-01
                  • 2014-05-29
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多