从嵌套JSON中提取Java

从嵌套JSON中提取Java,java,json,extract,Java,Json,Extract,我想在我的程序中使用雅虎的财务数据,它已经起作用了。我得到了完整的JSON内容,并且可以显示它。但是现在我想提取价格为int public class Main { public static void main (String[]args) throws IOException { String sURL = "http://finance.yahoo.com/webservice/v1/symbols/googl/quote?format=json"; //just a string

我想在我的程序中使用雅虎的财务数据,它已经起作用了。我得到了完整的JSON内容,并且可以显示它。但是现在我想提取价格为int

public class Main {
public static void main (String[]args) throws IOException {


String sURL = "http://finance.yahoo.com/webservice/v1/symbols/googl/quote?format=json"; //just a string

// Connect to the URL using java's native library
URL url = new URL(sURL);
HttpURLConnection request = (HttpURLConnection) url.openConnection();
request.connect();

// Convert to a JSON object to print data
JsonParser jp = new JsonParser(); //from gson
JsonElement root = jp.parse(new InputStreamReader((InputStream) request.getContent())); //convert the input stream to a json element
JsonObject rootobj = root.getAsJsonObject(); //may be an array, may be an object.

    System.out.print(rootobj);

}
}
编辑 这是来自yahoo的JSON数据

{
"list" : { 
"meta" : { 
"type" : "resource-list",
"start" : 0,
"count" : 1
},
"resources" : [ 
{
"resource" : { 
"classname" : "Quote",
"fields" : { 
"name" : "Google Inc.",
"price" : "554.520020",
"symbol" : "GOOGL",
"ts" : "1432324800",
"type" : "equity",
"utctime" : "2015-05-22T20:00:00+0000",
"volume" : "1213288"
}
}
}

]
}
}
编辑2

我改了密码

   JsonParser jp = new JsonParser(); //from gson
    JsonElement root = jp.parse(new InputStreamReader((InputStream) request.getContent())); //convert the input stream to a json element
        JsonObject obj = root.getAsJsonObject();
        JsonObject result = obj.get("list").getAsJsonObject();
        String result2 = result.get("resources").toString();


       System.out.print(result2);
现在我已经知道了

[{"resource":{"classname":"Quote","fields":{"name":"Google Inc.","price":"554.520020","symbol":"GOOGL","ts":"1432324800","type":"equity","utctime":"2015-05-22T20:00:00+0000","volume":"1213288"}}}]
我现在怎样才能得到“价格”

编辑3

好的,我现在拿到了,它很有效,我只拿到了双倍的价格,但是这是解决这个问题的明智方法吗

// Convert to a JSON object to print data
JsonParser jp = new JsonParser(); //from gson
JsonElement root = jp.parse(new InputStreamReader((InputStream) request.getContent())); //convert the input stream to a json element
    JsonObject obj = root.getAsJsonObject();
    JsonObject result = obj.get("list").getAsJsonObject();
    JsonArray result2 = result.get("resources").getAsJsonArray();
    JsonObject result3 = result2.get(0).getAsJsonObject();
    JsonObject result4 = result3.get("resource").getAsJsonObject();
    JsonObject result5 = result4.get("fields").getAsJsonObject();

    String result6 = result5.get("price").toString();
    result6 = result6.replace("\"", "");
    double value = Double.parseDouble(result6);


   System.out.print(value);
您应该到达“字段”对象以提取“名称”、“价格”等。
org.json
库易于使用。下面的示例代码:您的响应为字符串:

    JSONObject obj1 = new JSONObject(response);
    JSONArray arr = obj1.getJSONObject("list").getJSONArray("resources"); //GETS RESOURCES ARRAY

    for (int i = 0; i < arr.length(); i++)
    {
        String resource = arr.getJSONObject(i).toString();
        JSONObject obj2 = new JSONObject(resource);

        String resourceObject = obj2.getJSONObject("resource").toString(); //RESOURCE OBJECT
        JSONObject obj3 = new JSONObject(resourceObject);


        String name = obj3.getJSONObject("fields").getString("name"); //REACHED THE FIELDS
        float price = (float)obj3.getJSONObject("fields").getDouble("price");

    System.out.println(name);  
    System.out.println(price);


    }
JSONObject obj1=新的JSONObject(响应);
JSONArray arr=obj1.getJSONObject(“列表”).getJSONArray(“资源”)//获取资源数组
对于(int i=0;i

下载:

他已经在使用gson了

如果您想继续使用gson并了解其结构,可以创建存储数据的类

class GoogleRequest{
    private GoogleList list;

    public GoogleList getList() {
        return list;
    }

    public void setList(GoogleList list) {
        this.list = list;
    }
}
// class for list
class GoogleList{
    private Meta meta;
    private List<Resources> resources;

    public List<Resources> getResources() {
        return resources;
    }

    public void setResources(List<Resources> resources) {
        this.resources = resources;
    }

    public Meta getMeta() {
        return meta;
    }

    public void setMeta(Meta meta) {
        this.meta = meta;
    }
}
// create other classes here like the Resources class
JsonParser jp = new JsonParser(); // from gson
JsonElement root = jp.parse(new InputStreamReader((InputStream)request.getContent()));

GoogleRequest list = new Gson().fromJson(root,GoogleRequest.class);
如果您不知道它是数组还是对象,请创建不同的类来为您处理它。只需使用new Gson()解析数据即可

现在请记住,您需要作业的正确属性。假设您有java中的json

 String json = "{\"price\" : \"554.520020\"}";
那么价格就需要加倍或加倍。如果您使用Double,您可以检查

if( obj.getPrice() != null ){
  System.out.println( obj.getPrice().intValue() );
}

注意:如果将double转换为int,将失去精度

不清楚您的要求。你到底想拆分什么?你能提供一个明确的例子吗?我想分割JSON数据,以获取作为int值的价格。也许你是指提取数据(而不是分割)?你是否考虑过使用JSON解析器,如Gson?请检查我的编辑2。请检查我的编辑2。为资源对象创建一个持有者。并如上所述对其进行解析。想要完整的代码示例,请让我知道。我现在得到了它,它可以工作,请检查我的编辑3,如果这是一个聪明的解决方案或不是。
if( obj.getPrice() != null ){
  System.out.println( obj.getPrice().intValue() );
}