2015-05-23 2 views
1

Я хочу использовать финансовые данные из yahoo в своей программе, он уже работает. Я получаю полный контент JSON, и я могу его отобразить. Но теперь я хочу, чтобы выдержка цена int.Java-экстракт из вложенных JSON

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

} 
} 

EDIT Это является JSON данные Yahoo

{ 
"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" 
} 
} 
} 

] 
} 
} 

EDIT 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"}}}] 

Как я могу получить «цену» сейчас?

EDIT 3

Ok я получил это сейчас, это работает, и я только получить цену в два раза, но это умный способ решить эту задачу?

// 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); 
+0

Неясно, что вы просите. Что именно вы хотите разбить? Можете ли вы дать ясный пример? – Maroun

+0

Я хочу разбить данные JSON, чтобы получить цену как значение int. – Hendrik04

+0

Возможно, вы имеете в виду данные извлечения (не разделены)? –

ответ

0

вы должны достичь «полей» объект для извлечения «имя», «цена» и т.д. 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); 


    } 

Скачать: http://mvnrepository.com/artifact/org.json/json

+0

Проверьте мой EDIT 2. – Hendrik04

0

Он уже использует 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); 

В GoogleRequest должен храниться объект List и объект Meta. gson заинтересует и установит свойства. gson установит свойства null, если они не будут интродуцированы. Таким образом, вы можете использовать.

if(list.getResources() != null){ 
    // list is here 
}else{ 
    // do some other code and parse diffrent json 
} 

Если вы не знаете, если это массив или объект, создайте разные классы, чтобы обрабатывать его для вас. Просто проанализируйте данные с помощью нового Gson(). FromJson();

Теперь помните, что вам нужны правильные свойства для работы. Предположим, у вас есть этот json в java

String json = "{\"price\" : \"554.520020\"}"; 

Тогда цена должна быть двойной или двойной. Если вы используете Double вы можете проверить

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

Примечание: вы потеряете точность при разыгрывании двойной Int

+0

Проверьте мой EDIT 2. – Hendrik04

+0

Создайте держатель для ресурсного объекта. И проанализируйте его, как указано выше. Хотите полный пример кода, просто дайте мне знать. – Edgesoft

+0

Я получил его сейчас, и он работает, пожалуйста, проверьте мой EDIT 3, если это разумное решение или нет. – Hendrik04

Смежные вопросы