Разбор строки JSON в Android - PullRequest
7 голосов
/ 10 июня 2011

Синтаксический анализ JSON кажется довольно распространенной темой для обсуждения здесь.Я оглянулся и до сих пор не нашел то, что я ищу.Вот мой код для моего HttpClient

public class CreateJsonRequest {


    public static String SendJsonRequest(String URL, Map<String,Object> params){
            try{
                DefaultHttpClient httpClient = new DefaultHttpClient();
                HttpPost httpPost = new HttpPost(URL);

                JSONObject holder = new JSONObject();

                for (Map.Entry<String, Object> m : params.entrySet()){
                    try {
                        holder.put(m.getKey(), m.getValue());
                    }
                    catch (JSONException e) {
                        Log.e("Hmmmm", "JSONException : "+e);
                    }
                }   
                StringEntity se;
                se = new StringEntity(holder.toString());

                httpPost.setEntity(se);
                httpPost.setHeader("Accept", "text/json");
                httpPost.setHeader("Content-type", "text/json");

                HttpResponse response = httpClient.execute(httpPost);
                HttpEntity entity = response.getEntity();

                if(entity != null){
                    final JSONObject respObject = new JSONObject(EntityUtils.toString(entity));
                    String result = respObject.toString();      
                    parseJSON(result);

Я использую HttpClient для отправки запроса JSON на сервер.Затем сервер возвращает ответ в формате JSON.Это прекрасно работает.Теперь здесь я сталкиваюсь с неприятностями.Я получаю HttpEntity с сервера.Затем я превращаю это в строку, которая выглядит следующим образом.{"Make":"Ford","Year": 1975, "Model":"Mustang"} Я хочу иметь возможность отправить эту строку в мой метод parseJSON(String jString), и она возвращает карту значений ключей.Я чувствую, что это отличается от других сообщений тем, что я хочу, чтобы метод parse мог создавать карту значений ключей для любой строки JSON, которую я отправляю.Так что, если я отправлю это {"Engine":"v8","Cylinders": 8, "Transmission":"Manual","Gears": 4}, оно все равно будет работать.Это выполнимо?И если да, не могли бы вы дать мне толчок в правильном направлении?

Ответы [ 2 ]

20 голосов
/ 10 июня 2011

В этом случае вы можете использовать метод keys класса JSONObject. Он в основном возвращает Iterator ключей, которые вы можете затем перебрать, чтобы получить и поместить значения в карту:

try {
    JSONObject jsonObject = new JSONObject(theJsonString);
    Iterator keys = jsonObject.keys();
    Map<String, String> map = new HashMap<String, String>();
    while (keys.hasNext()) {
        String key = (String) keys.next();
        map.put(key, jsonObject.getString(key));
    }
    System.out.println(map);// this map will contain your json stuff
} catch (JSONException e) {
    e.printStackTrace();
}
1 голос
/ 11 июня 2011

Обратите внимание, что Джексон может десериализовать любой из двух примеров JSON очень просто.

ObjectMapper mapper = new ObjectMapper();
Map<String, Object> values = mapper.readValue(theJsonString, Map.class);

Gson может сделать это аналогично, просто если вы удовлетворены Map<String, String> вместо Map<String, Object>. В настоящее время Gson потребуется пользовательская десериализация для Map<String, Object>.

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