在 Java 中解析 JSON 字符串

新手上路,请多包涵

我正在尝试在 java 中解析 JSON 字符串以单独打印单个值。但是在使程序运行时,我收到以下错误-

 Exception in thread "main" java.lang.RuntimeException: Stub!
       at org.json.JSONObject.<init>(JSONObject.java:7)
       at ShowActivity.main(ShowActivity.java:29)

我的班级看起来像-

 import org.json.JSONException;
import org.json.JSONObject;

public class ShowActivity {
   private final static String  jString = "{"
   + "    \"geodata\": ["
   + "        {"
   + "                \"id\": \"1\","
   + "                \"name\": \"Julie Sherman\","
   + "                \"gender\" : \"female\","
   + "                \"latitude\" : \"37.33774833333334\","
   + "                \"longitude\" : \"-121.88670166666667\""
   + "                }"
   + "        },"
   + "        {"
   + "                \"id\": \"2\","
   + "                \"name\": \"Johnny Depp\","
   + "                \"gender\" : \"male\","
   + "                \"latitude\" : \"37.336453\","
   + "                \"longitude\" : \"-121.884985\""
   + "                }"
   + "        }"
   + "    ]"
   + "}";
   private static JSONObject jObject = null;

   public static void main(String[] args) throws JSONException {
       jObject = new JSONObject(jString);
       JSONObject geoObject = jObject.getJSONObject("geodata");

       String geoId = geoObject.getString("id");
           System.out.println(geoId);

       String name = geoObject.getString("name");
       System.out.println(name);

       String gender=geoObject.getString("gender");
       System.out.println(gender);

       String lat=geoObject.getString("latitude");
       System.out.println(lat);

       String longit =geoObject.getString("longitude");
       System.out.println(longit);
   }
}

让我知道我缺少什么,或者每次运行应用程序时都会出现该错误的原因。任何意见将不胜感激。

原文由 AKIWEB 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 452
2 个回答

见我的 评论。您需要在运行时包含完整的 org.json 库,因为 android.jar 仅包含要编译的存根。

此外,您必须在 --- 之后删除 JSON 数据中额外的 } longitude 两个实例。

    private final static String JSON_DATA =
     "{"
   + "  \"geodata\": ["
   + "    {"
   + "      \"id\": \"1\","
   + "      \"name\": \"Julie Sherman\","
   + "      \"gender\" : \"female\","
   + "      \"latitude\" : \"37.33774833333334\","
   + "      \"longitude\" : \"-121.88670166666667\""
   + "    },"
   + "    {"
   + "      \"id\": \"2\","
   + "      \"name\": \"Johnny Depp\","
   + "      \"gender\" : \"male\","
   + "      \"latitude\" : \"37.336453\","
   + "      \"longitude\" : \"-121.884985\""
   + "    }"
   + "  ]"
   + "}";

除此之外, geodata 实际上不是 JSONObject 而是 JSONArray

这是完全工作且经过测试的更正代码:

 import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

public class ShowActivity {

  private final static String JSON_DATA =
     "{"
   + "  \"geodata\": ["
   + "    {"
   + "      \"id\": \"1\","
   + "      \"name\": \"Julie Sherman\","
   + "      \"gender\" : \"female\","
   + "      \"latitude\" : \"37.33774833333334\","
   + "      \"longitude\" : \"-121.88670166666667\""
   + "    },"
   + "    {"
   + "      \"id\": \"2\","
   + "      \"name\": \"Johnny Depp\","
   + "      \"gender\" : \"male\","
   + "      \"latitude\" : \"37.336453\","
   + "      \"longitude\" : \"-121.884985\""
   + "    }"
   + "  ]"
   + "}";

  public static void main(final String[] argv) throws JSONException {
    final JSONObject obj = new JSONObject(JSON_DATA);
    final JSONArray geodata = obj.getJSONArray("geodata");
    final int n = geodata.length();
    for (int i = 0; i < n; ++i) {
      final JSONObject person = geodata.getJSONObject(i);
      System.out.println(person.getInt("id"));
      System.out.println(person.getString("name"));
      System.out.println(person.getString("gender"));
      System.out.println(person.getDouble("latitude"));
      System.out.println(person.getDouble("longitude"));
    }
  }
}

这是输出:

 C:\dev\scrap>java -cp json.jar;. ShowActivity
1
Julie Sherman
female
37.33774833333334
-121.88670166666667
2
Johnny Depp
male
37.336453
-121.884985

原文由 obataku 发布,翻译遵循 CC BY-SA 3.0 许可协议

要将您的 JSON 字符串转换为哈希 图,您可以使用它:

 HashMap<String, Object> hashMap = new HashMap<>(Utility.jsonToMap(response)) ;

使用此类 : )(处理偶数列表、嵌套列表和 json)

 public class Utility {

    public static Map<String, Object> jsonToMap(Object json) throws JSONException {

        if(json instanceof JSONObject)
            return _jsonToMap_((JSONObject)json) ;

        else if (json instanceof String)
        {
            JSONObject jsonObject = new JSONObject((String)json) ;
            return _jsonToMap_(jsonObject) ;
        }
        return null ;
    }

   private static Map<String, Object> _jsonToMap_(JSONObject json) throws JSONException {
        Map<String, Object> retMap = new HashMap<String, Object>();

        if(json != JSONObject.NULL) {
            retMap = toMap(json);
        }
        return retMap;
    }

    private static Map<String, Object> toMap(JSONObject object) throws JSONException {
        Map<String, Object> map = new HashMap<String, Object>();

        Iterator<String> keysItr = object.keys();
        while(keysItr.hasNext()) {
            String key = keysItr.next();
            Object value = object.get(key);

            if(value instanceof JSONArray) {
                value = toList((JSONArray) value);
            }

            else if(value instanceof JSONObject) {
                value = toMap((JSONObject) value);
            }
            map.put(key, value);
        }
        return map;
    }

    public static List<Object> toList(JSONArray array) throws JSONException {
        List<Object> list = new ArrayList<Object>();
        for(int i = 0; i < array.length(); i++) {
            Object value = array.get(i);
            if(value instanceof JSONArray) {
                value = toList((JSONArray) value);
            }

            else if(value instanceof JSONObject) {
                value = toMap((JSONObject) value);
            }
            list.add(value);
        }
        return list;
    }
}


原文由 Natesh bhat 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题