2014-01-16 2 views
-1

이 URL을 사용하여 JSON에서 값을 가져 오려고합니다 : http://api.bitcoincharts.com/v1/markets.json. 나 quick-json 그것을 사용하여 문제는 내가 어떻게 JSON 매우 나에게 자바에서 혼란 이후 그것을 어떻게 해야할지 모르겠다. 여기에 http://api.bitcoincharts.com/v1/markets.json을 가져 와서 해시 맵에 넣는 값을 얻고 싶습니다 ... 그래서 퀵 - json을 사용하여 구문 분석을 위해 키를 검색 할 수 있습니다 ... 누군가 다음 코드를 사용하여 어떻게 진행해야하는지 알려줄 수 있습니까? ?Java JSON 연결 및 파싱

import com.json.parsers.JSONParser; 
import com.json.parsers.JsonParserFactory; 
import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.HttpURLConnection; 
import java.net.MalformedURLException; 
import java.net.URL; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.Map; 
import sun.org.mozilla.javascript.internal.json.JsonParser; 



public class Restfultest { 

    public static float [] lastprice = new float[5000]; 
    public static float [] amounttraded = new float[5000]; 
    public static String allvalue; 
    public static int value = 0; 
    public static String [] s = new String[4]; 

    public static void main(String[] args) { 

     try { 

     URL url = new URL("http://api.bitcoincharts.com/v1/markets.json"); 
     HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
     conn.setRequestMethod("GET"); 
     conn.setRequestProperty("Accept", "application/json"); 

     if (conn.getResponseCode() != 200) { 
      throw new RuntimeException("Failed : HTTP error code : " 
        + conn.getResponseCode()); 
     } 
       /* 
     BufferedReader br = new BufferedReader(new InputStreamReader(
      (conn.getInputStream())));*/ 

       JsonParserFactory factory=JsonParserFactory.getInstance(); 
       JSONParser parser=factory.newJsonParser(); 
       Map jsonData=parser.parse(conn.getInputStream()); /*Gives error because of conn.getInputStream*/ 


       /* 

        parsing... 


       */ 
     conn.disconnect(); 

     } catch (MalformedURLException e) { 

     e.printStackTrace(); 

     } catch (IOException e) { 

     e.printStackTrace(); 

     } 

    } 

내가 그 라인에서 얻을 오류 난 구문 분석에 넣어 객체 유형 JSONParser입니다 때문에 내가 어떻게 JSON 전혀 자바에서 사용합니까? 이것은 매우 혼란 ... 문이 안 열려 ... 웹 API에 연결하고 몇 가지 값을 검색하는 방법을 보여 좋은 예 ...

은 정말 ... 어떤 도움을 주셔서 감사합니다 감사 할 찾을

+2

당신이 점점 정확한 오류가 무엇입니까? –

+0

구문 분석에 넣은 객체가 JSONParser 유형이므로 JSON을 Java에서 모두 사용하는 이유는 무엇입니까? 매우 혼란 스럽습니다 ... 웹 API에 연결하고 일부 값을 검색하는 방법을 보여주는 좋은 예제를 찾을 수 없습니다. – exceltior

+0

@exceltior 감사합니다. 정확한 오류 메시지를 복사하여 붙여 넣으십시오. –

답변

2

첫 번째 문제는 JSON과 완전히 관련이 없으며 Java를 이해하지 못하는 것입니다. 잘 작동, 그 변화 후

Map<String,String> jsonData=parser.parseJson(conn.getInputStream(), "UTF-8"); 

:

JSONParser.parse()

InputStream에 따라 문자 집합 이름이 필요합니다. 그러나 그렇게 유용하지는 않습니다.

URL you supply의 응답을 보면 대답은 놀라 울 정도로 간단합니다. JSON은 Map으로 변환 될 수있는 것이 아닙니다. 따라서 정확히 하나의 엔트리 (root)와 전체 JSON 응답을 값으로 (그리고 부팅을 위해 맹 글링하여) 매핑 한 Map이 있습니다.

요컨대, 실제로 제한된, 거의 문서화되지 않은 JSON 구문 분석기를 사용하고 있으며이를 통해 파고있는 것을 발견 할 수 있습니다. 최상위 레벨의 배열 인 JSON 응답을 구문 분석 할 수 없습니다. 여기을 Google Gson library이 데이터를 검색하는 데 사용하는 완벽한 솔루션입니다 :

편집 추가

import com.google.gson.Gson; 
import com.google.gson.reflect.TypeToken; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.HttpURLConnection; 
import java.net.URL; 
import java.util.ArrayList; 
import java.util.List; 

public class App 
{ 
    public static void main(String[] args) throws IOException 
    { 
     URL url = new URL("http://api.bitcoincharts.com/v1/markets.json"); 
     HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
     conn.setRequestMethod("GET"); 
     conn.setRequestProperty("Accept", "application/json"); 

     if (conn.getResponseCode() != 200) { 
      throw new RuntimeException("Failed : HTTP error code : " 
        + conn.getResponseCode()); 
     } 

     InputStreamReader isr = new InputStreamReader(conn.getInputStream()); 
     TypeToken<List<MyJsonClass>> token = new TypeToken<List<MyJsonClass>>(){}; 
     List<MyJsonClass> list = new Gson().fromJson(isr, token.getType()); 

     for (MyJsonClass mjc : list) 
     { 
      System.out.println(mjc.symbol + " : " + mjc.latest_trade); 
     } 
    } 
} 

// No getters/setters for simple example 
class MyJsonClass 
{ 

    /* 
    {"volume": 8.621800000000, "latest_trade": 1389906326, 
     "bid": 11149.760000000000, "high": 10794.930000000000, 
     "currency": "ZAR", "currency_volume": 88097.489637000000, 
     "ask": 9722.590000000000, "close": 10350.000000000000, 
     "avg": 10217.99272042960866640376719, "symbol": "localbtcZAR", 
     "low": 9262.100000000000} 
    */ 

    public double volume; 
    public int latest_trade; 
    public double bid; 
    public double high; 
    public String currency; 
    public double currency_volume; 
    public double ask; 
    public double close; 
    public double avg; 
    public String symbol; 
    public double low; 
} 
+0

전혀 자바 문제가 아니다 ... 문제는 JSON 용 괜찮은 라이브러리를 찾아서 데이터를 파싱하는 것과 같다. 엄청난 수의 필드에 제대로 작동하도록 만들어야합니다. – exceltior

+1

@exceltior 기분이 좋았습니다. 업데이트 된 답변을 참조하십시오. –

+0

시간 내 주셔서 감사합니다. :) 정말 고마워요. – exceltior

-1

당신 살펴 보셔야합니다 Google's GSON

기본적으로 기본 유형을 포함하는 POJO를 만들 수 있으며 GSON이 클래스에 자동으로 JSON 데이터를 채울 수 있습니다.

은 구문 분석 할 수 this basic example

+0

이 질문에 대답하지 않습니다. 그것은 또한 실제 문제가 아닙니다. –

0

다음은 누락 부분 StringInputStream의 데이터를 받으시는 방법을 살펴보십시오 : 여기 참조 : 그 작업을 수행하는 방법에 대한 Read/convert an InputStream to a String - 당신이이 알면 200 OK 요청에 대한 응답으로 연결의 InputStream에서 데이터를 String으로 가져 와서 구문 분석 메소드에 전달하십시오.

+0

그는 * InputStream을가집니다. 그는 JsonParser에 전달합니다. –

+0

@BrianRoach 입력 스트림이있는 것을 볼 수는 있지만 모든 JsonParser가 입력 스트림을 가져 오는 것은 아니며, 그가 사용하는 코드를 가져올 수는 없습니다. 그러나 그의 코드에있는 주석은'/ * conn.getInputStream * /'때문에 에러를 낸다. - 그가 parse 메소드로 넘겨주는 입력 스트림으로부터 에러를 얻는다. 그래서, 그의 JsonParse는 InputStream을 취하지 않을 것 같았 습니다만, String을 가져 가지 않는 JsonParser를 상상할 수는 없습니다 ... – JVMATL

+0

왜 그가 사용하고 있는지를 알 수없는 이유는 모르겠습니다. , 그것은'com.json.parsers.JSONParser' (https://code.google.com/p/quick-json/)입니다. –