Разобрать JSON с усами на Android - PullRequest
1 голос
/ 17 ноября 2011

Я читаю массив объектов JSON из API и надеюсь использовать Mustache для отображения данных в хорошем формате HTML.

Я скачал предварительно созданный файл .jar из https://github.com/samskivert/jmustache, и без проблем запустил hello world:

String text = "One, two, {{three}}. Three sir!";
Template tmpl = Mustache.compiler().compile(text);
Map<String, String> data = new HashMap<String, String>();
data.put("three", "five");
Log.d("json",tmpl.execute(data));

Как мне скормить мой JSONObject для усов?

Я попробовал это:

JSONObject eventJSON = events.getJSONObject(event_count);
String text = "<h1>{{summary}}</h1>";
Template tmpl = Mustache.compiler().compile(text);
Log.d("this breaks", tmpl.execute(eventJSON));

Logcat говорит: "No key, method or field with name 'summary' on line 1"

Я получаю ту же ошибку при отправке строки JSON:

Log.d("this breaks", tmpl.execute(eventJSON.toString()));

eventJSON.toString () приводит к действительно длинной строке, который начинается

{"summary":"the LUSTER a.k.a. VJ WADAKENによるウィークデーモンスターパーティー。\r\n","invitations":[],"genres":[1,2],"open_date":"2011-11-17"...

Нужно ли преобразовать JSON в хеш ?

Ошибка заполнения Logcat:

11-17 12:04:19.080: E/AndroidRuntime(17227): FATAL EXCEPTION: AsyncTask #2
11-17 12:04:19.080: E/AndroidRuntime(17227): java.lang.RuntimeException: An error occured while executing doInBackground()
11-17 12:04:19.080: E/AndroidRuntime(17227):    at android.os.AsyncTask$3.done(AsyncTask.java:266)
11-17 12:04:19.080: E/AndroidRuntime(17227):    at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
11-17 12:04:19.080: E/AndroidRuntime(17227):    at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
11-17 12:04:19.080: E/AndroidRuntime(17227):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
11-17 12:04:19.080: E/AndroidRuntime(17227):    at java.util.concurrent.FutureTask.run(FutureTask.java:137)
11-17 12:04:19.080: E/AndroidRuntime(17227):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1081)
11-17 12:04:19.080: E/AndroidRuntime(17227):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:574)
11-17 12:04:19.080: E/AndroidRuntime(17227):    at java.lang.Thread.run(Thread.java:1020)
11-17 12:04:19.080: E/AndroidRuntime(17227): Caused by: com.samskivert.mustache.MustacheException: No key, method or field with name 'summary' on line 1
11-17 12:04:19.080: E/AndroidRuntime(17227):    at com.samskivert.mustache.Mustache$VariableSegment.execute(Mustache.java:520)
11-17 12:04:19.080: E/AndroidRuntime(17227):    at com.samskivert.mustache.Template.executeSegs(Template.java:70)
11-17 12:04:19.080: E/AndroidRuntime(17227):    at com.samskivert.mustache.Template.execute(Template.java:58)
11-17 12:04:19.080: E/AndroidRuntime(17227):    at com.samskivert.mustache.Template.execute(Template.java:48)
11-17 12:04:19.080: E/AndroidRuntime(17227):    at com.example.android.events.AsyncJSONEventParser.parseEventJSON(AsyncJSONEventParser.java:88)
11-17 12:04:19.080: E/AndroidRuntime(17227):    at com.example.android.events.AsyncJSONEventParser.doInBackground(AsyncJSONEventParser.java:40)
11-17 12:04:19.080: E/AndroidRuntime(17227):    at com.example.android.events.AsyncJSONEventParser.doInBackground(AsyncJSONEventParser.java:1)
11-17 12:04:19.080: E/AndroidRuntime(17227):    at android.os.AsyncTask$2.call(AsyncTask.java:252)
11-17 12:04:19.080: E/AndroidRuntime(17227):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)

1 Ответ

0 голосов
/ 16 января 2012

JSON нельзя использовать в качестве строки, и он должен быть хэшем ... Я делаю это с Джексоном.Смотрите этот пост о разборе Джексона за 5 минут

@SuppressWarnings("unchecked")
protected void parseJsonString(String json){
    try {
        ObjectMapper mapper = new ObjectMapper();
        //Object root = mapper.readValue(json, Object.class);
        //Map<String,String> rootAsMap = mapper.readValue(json, Map.class);
        //rails 3.0.3 is bad and doesn't qoute strings
        userData = (Map<String,Object>) mapper.readValue(json, Map.class);
    } catch (JsonParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (JsonMappingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } 
}
...