2014-01-16 56 views
-1

我想从使用此URL的JSON获取一些值:http://api.bitcoincharts.com/v1/markets.json。我使用quick-json来解析它的问题是我不知道该怎么做,因为JSON在JAVA中让我感到非常困惑。 我想获得你在这里得到的值http://api.bitcoincharts.com/v1/markets.json并把它们放在Hashmap中...所以我可以通过快捷键解析使用快捷键检索它们...任何人都可以帮助我告诉我如何继续使用下面的代码?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的我如何在Java的使用JSON呢?这是非常混乱...不能找到任何好的例子,说明如何连接到一个网络API和检索一些值...

真的希望得到一些帮助... 感谢...

+2

什么是你所得到的确切的错误? –

+0

这个错误是因为我解析的对象是JSONParser类型的,我如何在Java上使用JSON?是很混乱...找不到任何好的例子,显示如何连接到一个Web API和检索一些值... – exceltior

+0

@exceltior请复制并粘贴您收到确切的错误消息,谢谢。 –

回答

2

您的第一个问题与JSON无关,完全无法理解Java。

JSONParser.parse()需要与InputStream沿字符集名称:

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

这种变化之后,它工作正常。然而,这并不会有用。

查看URL you supply的回复,答案非常简单:JSON不是任何可以转换为Map的东西。因此,您得到的是一个只包含一个条目(root)并且整个JSON响应为值(并且被修改为引导)的映射。

简而言之,您使用的是一个非常有限,几乎没有记录的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

不是所有的java问题...问题是找到一个体面的JSON库,因为它如此混乱以解析数据进入大量的领域,我必须创建正常工作... – exceltior

+1

@exceltior感到慷慨,看到更新的答案。 –

+0

非常感谢您的时间... :)真的很感谢... – exceltior

-1

你应该看看Google's GSON

你基本上可以做一个POJO,它包含原生类型,GSON会自动将你的类填充为JSON数据。

看看this basic example

+0

这并不回答问题。这也不是首要的实际问题。 –

0

你缺少的部分是如何获得从InputStream数据为String可以解析:在这里看到:Read/convert an InputStream to a String如何做到这一点 - 一旦你知道你有一个200 OK响应您的请求,将连接的InputStream中的数据抽取到String中并将其传递给您的解析方法。

+0

他*有'InputStream';他将它传递给'JsonParser' –

+0

@BrianRoach我可以看到他有输入流,但并不是每个JsonParser都需要一个输入流,而且我无法弄清(从他的输入)他正在使用哪一个;但他的代码中的注释说'/ *由于conn.getInputStream * /给出错误 - 他从传递给解析方法的输入流中获取错误。所以,它似乎可能是我的他的JsonParse不采取InputStreams - 但我无法想象一个JsonParser不会采取字符串... – JVMATL

+0

我不知道你为什么不能弄清楚他在用什么,它是'com.json.parsers.JSONParser'(https://code.google.com/p/quick-json/),它采用InputStream,因此我的评论。 –