2015-07-28 4 views
0

Мне нужно разобрать этот json-файл, но он в таком странном формате. https://rsbuddy.com/exchange/summary.json Я использую Гссона, и я никогда не занимался с Джоном, поэтому я совершенно потерялся.Разбор Json с Gson, массив без []?

"2": {"buy_average": 191, "id": 2, "sell_average": 191, "name": "Cannonball", "overall_average": 191} 

После прочтения этого ответа Parsing JSON from URL

я пришел с кодом здесь:

public class AlchemyCalculator { 
public static void main(String[] args) throws Exception { 

    String json = readUrl("https://rsbuddy.com/exchange/summary.json"); 

    Gson gson = new Gson();   
    Page page = gson.fromJson(json, Page.class); 
    System.out.println(page.items.size()); 
    for (Item item : page.items) 
     System.out.println(" " + item.buy_average); 
} 


private static String readUrl(String urlString) throws Exception { 
    BufferedReader reader = null; 
    try { 
     URL url = new URL(urlString); 
     reader = new BufferedReader(new InputStreamReader(url.openStream())); 
     StringBuffer buffer = new StringBuffer(); 
     int read; 
     char[] chars = new char[1024]; 
     while ((read = reader.read(chars)) != -1) 
      buffer.append(chars, 0, read); 

     System.out.println("{items: [" +buffer.substring(1, buffer.length() -1) + "]}"); 

     return "{items: [" +buffer.substring(1, buffer.length() -1) + "]}"; 
    } finally { 
     if (reader != null) 
      reader.close(); 

    } 
} 


static class Item { 
    int buy_average; 
    int id; 
    int sell_average; 
    String name; 
    int overall_average; 

} 

static class Page { 
    List<Item> items; 
} 
} 

Я не понимаю, как разобрать его, хотя, я видел ответы, которые говорят на настройте иерархию соответствия объектов, но я не вижу, как это сделать здесь.

Заранее благодарим за это, а также извиняюсь заранее за миллионы вопросов Json здесь, и я не могу понять из них.

+0

https://google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/com/google/gson/Gson.html будет хорошим началом для вас. В документации показаны все доступные методы – Pindo

ответ

1

Если вы хотите использовать Gson для разбора строка как список Item класс, есть обходное решение, которое заключается в следующем:

List<Item> itemsOnPage = new ArrayList<Item>(); 
    String content = readUrl("https://rsbuddy.com/exchange/summary.json"); 
    Gson gson = new GsonBuilder().create(); 
    // the json value in content is like key-value pair which can be treated as a map 
    // {2: item1, 3: item2, 4: item4, .....} 
    HashMap<String, Object> items = new HashMap<>(); 
    items = (HashMap<String, Object>) gson.fromJson(content, items.getClass()); 
    for (String key : items.keySet()) { 
     // Once you have converted the json into a map and since the value associated 
     // with it is also a set of key-value pairs it is treated as LinkedTreeMap 
     LinkedTreeMap<String, Object> itemMap = (LinkedTreeMap<String, Object>) items.get(key); 
     // convert it back to json representation to that we could 
     // parse it to an object of the Item class 
     String itemString = gson.toJson(itemMap); 
     // what we have now in itemString is like this: 
     // {"id": 2, "name": "Cannonball", "buy_average": 191, "overall_average": 193, "sell_average": 192} 
     Item item = new Item(); 
     item = gson.fromJson(itemString, item.getClass()); 
     // add the current item to the list 
     itemsOnPage.add(item); 
    } 

То, что вам также нужно понять, это синтаксис Json. Структура JSON из выше URL, как:

{ 
    "2": { ...some details related to item... }, 
    "3": { ...some details related to item... }, 
    ... 
    ... 
} 

Вы не можете непосредственно разобрать его как List<?>, потому что это не так. В Json этот список repsented как массив [item1, item2] (проверить http://www.w3schools.com/json/) в то время как выше представление словаря - идентификатор, связанный с каждым элементом т.е.

{2: item1, 3: item2, 4: item4, .....} 

, где каждый элемент сам по себе имеет некоторые свойства, например,

{"id": 2, "name": "Cannonball", "buy_average": 191, "overall_average": 193, "sell_average": 192} 
1

Вы можете попробовать использовать JsonReader в поток ответа JSON и разобрать его, как это:

Reader streamReader = new InputStreamReader(url.openStream()); 
    JsonReader reader = new JsonReader(streamReader); 
    reader.beginObject(); 
    while (reader.hasNext()) { 
     String name = reader.nextName(); //This is the JsonObject Key 
     if (isInteger(name)) { 
      reader.beginObject(); 
      while (reader.hasNext()) { 
       String name = reader.nextName(); 
       if (name.equals("id")) { 
        //get the id 
       } else if (name.equals("name")) { 
        //get the name 
       } else if (name.equals("buy_average")) { 
        //get the buy average 
       } else if (name.equals("overall_average")) { 
        //get the overall average 
       } else if (name.equals("sell_average")) { 
        //get the sell average 
       } else { 
        reader.skipValue(); 
       } 
      } 
      reader.endObject(); 
     } 
    } 
    reader.endObject(); 
    reader.close(); 

где isInteger функция:

public static boolean isInteger(String str) { 
    if (str == null) { 
     return false; 
    } 
    int length = str.length(); 
    if (length == 0) { 
     return false; 
    } 
    int i = 0; 
    if (str.charAt(0) == '-') { 
     if (length == 1) { 
      return false; 
     } 
     i = 1; 
    } 
    for (; i < length; i++) { 
     char c = str.charAt(i); 
     if (c < '0' || c > '9') { 
      return false; 
     } 
    } 
    return true; 
} 
Смежные вопросы