Почему я не могу получить доступ к вложенному свойству org.json.JSONObject в шаблоне скорости при объединении шаблона - PullRequest
0 голосов
/ 04 ноября 2019

Невозможно получить доступ к некоторым (не всем) полям свойств в JSONObject, который содержит различные массивы.

Исключение:

org.apache.velocity.exception.MethodInvocationException: 
  Invocation of method 'get' in  class org.json.JSONObject threw exception org.json.JSONException: 
  JSONObject["published"] not found. at templates/eventbrite.vsl[line 43, column 41]

Я пробовал практически каждую возможную перестановку методов доступа к свойствам шаблона скорости $object.published / "$object.published" / "{$object.published} из различных веб-ресурсов.

Цели этого проекта: [На стороне сервера]

  1. [отлично работает] Получить String json_result из вызова веб-сайта / API (например, Eventbrite).
  2. [похоже, также работает] создайте org.json.JSONObject jsonObj из этой строки.
  3. [работает] поместите его в контекст VelocityContext.
  4. [не работает] используя пользовательский шаблон, извлеките необходимые данные из jsonObj.
  5. [работает, когда 4 не работает], создайте новый стандартизированный JSON для соответствия другим источникам API событий. Данные Rosetta Stone о событиях json.
public String publish(String templatePath, String json_result, Map model, VelocityContext context) throws IOException
{      
    Writer writer = new StringWriter();     
    try
    {
        JSONObject jsonObj = new JSONObject(json_result.trim());
        Object valueObj;

        for (String key : jsonObj.keySet())
        {
            valueObj = jsonObj.get(key.trim());
            context.put(key, valueObj);
            logger.info("Adding K,V: "+key+" in context");
        }

        Iterator it = model.entrySet().iterator();
        while (it.hasNext())
        {
            Map.Entry pair = (Map.Entry) it.next();
            logger.info("Adding K,V: " + pair.getKey().toString() + " , " + pair.getValue() + " to velocity context");
            context.put(pair.getKey().toString(), pair.getValue());
            it.remove(); /* avoids a ConcurrentModificationException */
        }
    // following line is where it all dies apparently

        velocityEngine.mergeTemplate(templatePath, "UTF-8", context, writer);
    }
    catch (JSONException e)
    {
        e.printStackTrace();
    }        

    writer.flush();
    String result = writer.toString();
    logger.info("\n[MERGED JSON START - "+templatePath+"]\n"+result+"\n[MERGED JSON END]\n");    
    return result;
}

json_result согласованные данные (сильно отредактированные для ясности):

[

    {
    "shareable":true,
    "is_series_parent":false,
    "description":{"html":"......<BR>really long description","text":"same minus html"
    },
    "source":"create_2.0",
    "format_id":"6",
    "logo":{},
    "end":{
    "utc":"2019-11-19T17:30:00Z",
    "timezone":"America/New_York",
    "local":"2019-11-19T12:30:00"
    },
    "currency":"USD",
    "id":"68282188865",
    "venue_id":"36369841",
    "summary":"\u201cLady Bug: Action Hero!\u201d is the story of a brave little lady bug and the animal friends that live with her in the rainforest. Performed by D",
    "start":{
    "utc":"2019-11-19T16:30:00Z",
    "timezone":"America/New_York",
    "local":"2019-11-19T11:30:00"
    },
    "published":"2019-08-07T15:13:47Z",
    "version":"3.0.0"
    }

    ,{},{},{} 50 items total in this array...
]
...