Android JSON это разобрать, как? - PullRequest
0 голосов
/ 13 июля 2011
 [
    {
        "hotelid": [
            {
                "hotelid": "1",
                "name": "aaa",
                "code": "111",
                "price": "111"
            },            
            {
                "hotelid": "2",
                "name": "bbb",
                "code": "112",
                "price": "211"
            },
            {
                "hotelid": "4",
                "name": "ccc",
                "code": "42",
                "price": "411"
            }

...

У меня есть этот JSON, как я могу разобрать его в Android?Я пробовал, но я получаю только ошибки.

код:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    mycontext=this;

    examineJSONFile();
}

class Result
{
  List<Hotel> hotel; // name matches name in JSON

  @Override
  public String toString() {return hotel.toString();}
}


class Hotel
{
  String code;          // name matches name in JSON
  String name;          // name matches name in JSON
  String hotelid;       // name matches name in JSON

  @Override
  public String toString()
  {
    return String.format("hotelid:{code=%s, name=%s, hotelid=%s}", code, name, hotelid);  
  }
}


void examineJSONFile()    {

    InputStream is = this.getResources().openRawResource(R.raw.promo);
    String s;
    try {
        s = HttpConnect.streamToString(is);

        ObjectMapper mapper = new ObjectMapper();
        mapper.setVisibilityChecker(mapper.getVisibilityChecker().withFieldVisibility(Visibility.ANY));

        Result[] results = mapper.readValue(s, Result[].class);
        Result result = results[0];

        Log.e("res", result.toString()+"");


    } catch (Exception e) {
        Log.e("err", e+"");
    }


}

ОШИБКА / err (23124): org.codehaus.jackson.map.JsonMappingException: не может десериализоватьКласс com.android.asd.asdStart $ Result (из класса нестатического члена класса) в виде компонента

Ответы [ 5 ]

4 голосов
/ 13 июля 2011

Я попытался разобрать эту строку JSON, и у меня есть одно решение, попробуйте также:

String parse = "[{\"hotelid\":[{\"hotelid\":\"1\",\"name\":\"aaa\",\"code\":\"111\",\"price\":\"111\"},{\"hotelid\":\"2\",\"name\":\"bbb\",\"code\":\"112\",\"price\":\"211\"},{\"hotelid\":\"4\",\"name\":\"ccc\",\"code\":\"42\",\"price\":\"411\"}]}]";
            try {
                JSONArray menuObject = new JSONArray(parse);
                for(int i=0;i<menuObject.length();i++){
                    String hotel =    menuObject.getJSONObject(i).getString("hotelid").toString();
                    System.out.println("hotel="+hotel);
                    JSONArray menuObject1 = new JSONArray(hotel);
                    for(int j=0; j<menuObject1.length();j++){
                        String hotelid =    menuObject1.getJSONObject(j).getString("hotelid").toString();
                        System.out.println("hotelid=="+hotelid);

                        String name =    menuObject1.getJSONObject(j).getString("name").toString();
                        System.out.println("name=="+name);

                        String code =    menuObject1.getJSONObject(j).getString("code").toString();
                        System.out.println("code=="+code);

                        String price =    menuObject1.getJSONObject(j).getString("price").toString();
                        System.out.println("price=="+price);

                    }
                }

            } catch (JSONException e) {
                e.printStackTrace();
            }
3 голосов
/ 13 июля 2011

Сделайте Результат класса и Отель статичным. Парсер не может создать экземпляр внутреннего класса, который не является статическим

3 голосов
/ 13 июля 2011

Ниже приведен пример использования Джексона в качестве библиотеки Java-to / from-JSON.Джексон - это один из самых быстрых и многофункциональных API-интерфейсов Java / JSON.

Я догадался, какова на самом деле целевая структура JSON.

import java.util.List;

import org.codehaus.jackson.annotate.JsonAutoDetect.Visibility;
import org.codehaus.jackson.map.ObjectMapper;

public class Foo
{
  public static void main(String[] args) throws Exception
  {
    // input:
    // [
    //   {
    //     "hotel": [
    //       {"id":"52472","name":"africa","hotel":"asd"},
    //       {"id":"52471","name":"europe","hotel":"asd2"},
    //       {"id":"52470","name":"europe","hotel":"asd3"}
    //     ]
    //   }
    // ]
    String input = "[{\"hotel\":[{\"id\":\"52472\",\"name\":\"africa\",\"hotel\":\"asd\"},{\"id\":\"52471\",\"name\":\"europe\",\"hotel\":\"asd2\"},{\"id\":\"52470\",\"name\":\"europe\",\"hotel\":\"asd3\"}]}]";

    ObjectMapper mapper = new ObjectMapper();
    // configure Jackson to access non-public fields
    mapper.setVisibilityChecker(mapper.getVisibilityChecker().withFieldVisibility(Visibility.ANY));

    Result[] results = mapper.readValue(input, Result[].class);
    Result result = results[0];
    System.out.println(result);
  }
}

class Result
{
  List<Hotel> hotel; // name matches name in JSON

  @Override
  public String toString() {return hotel.toString();}
}

class Hotel
{
  String id; // name matches name in JSON
  String name; // name matches name in JSON
  String hotel; // name matches name in JSON

  @Override
  public String toString()
  {
    return String.format("Hotel:{id=%s, name=%s, hotel=%s}", id, name, hotel);  
  }
}
3 голосов
/ 13 июля 2011

Этот вопрос задают очень много раз.

Используйте com.google.gson пакет.это на 99% похоже на пакет org.json (json.jar).

Вы должны Google его в следующий раз.

2 голосов
/ 13 июля 2011

Этот JSON недействителен. Вы скучаете по закрывающей скобке. Вы можете проверить свой JSON здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...