【问题标题】:Android JSON parse this, how?Android JSON解析这个,如何?
【发布时间】:2011-10-04 05:36:37
【问题描述】:
 [
    {
        "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+"");
    }


}

错误/错误(23124):org.codehaus.jackson.map.JsonMappingException:可以 不反序列化 com.android.asd.asdStart$Result 类(类型 非静态成员类)作为 Bean

【问题讨论】:

  • "我试过了,但我只得到错误。"然后你应该发布代码并寻求错误的帮助。就目前而言,这个问题属于“gimme teh codez”的范畴。

标签: android json


【解决方案1】:

我已尝试解析该 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();
            }

【讨论】:

    【解决方案2】:

    这个问题被问了很多次。

    使用com.google.gson 包。它与 org.json 包 (json.jar) 有 99% 的相似度。

    你应该下次谷歌它。

    【讨论】:

    • 接受的答案如何起作用?您的代码与 JSON 无关。您正在使用其他一些 3rd 方 JSON 库。 -1 表示不好的问题。
    【解决方案3】:

    以下是使用 Jackson 作为 Java-to/from-JSON 库的示例。 Jackson 是可用的快速、功能最丰富的 Java/JSON API 之一。

    我猜测了实际的目标 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);  
      }
    }
    

    【讨论】:

    • 07-13 10:06:33.008: ERROR/err(23124): org.codehaus.jackson.map.JsonMappingException: 无法反序列化类 com.android.asd.asdStart$Result(类型非静态成员类)作为 Bean
    • 看起来您复制的代码与我提供的不同。看起来您将某些东西作为其他东西的内部类。我发布的代码没有任何内部类定义。如果您仍然遇到问题,请发布复制问题所需的全部代码。
    • 在您的情况下,您应该将 Result 和 Hotel 类设为静态,因为您将它们移动到 Activity 类中
    • 是的,你是对的。新错误:07-13 16:38:59.676:错误/错误(504):org.codehaus.jackson.map.exc.UnrecognizedPropertyException:无法识别的字段“hotelid”(类 com.android.asd.asdStart$Result),不是标记为可忽略
    【解决方案4】:

    将类 Result 和 Hotel 设为静态。解析器无法创建非静态内部类的实例

    【讨论】:

      【解决方案5】:

      此 JSON 无效。您错过了关闭 ] 括号。你可以检查你的 JSON here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-06
        相关资源
        最近更新 更多