Итерация JSONArray в шаблоне Velocity

Я пытаюсь выполнить итерацию JSONArray в шаблоне скорости, но это не работает. Я обнаружил, что шаблон скорости может выполнять итерацию объектов коллекции, массива, хэш-карты. Кто-нибудь может помочь мне выполнить итерацию JSONArray

Заранее спасибо


person Rakesh Garg    schedule 18.08.2012    source источник
comment
какую библиотеку json вы используете? практически у каждого есть класс с именем JSONArray, который работает немного по-другому. не зная, какая у вас библиотека, невозможно ответить на вопрос!   -  person stevevls    schedule 18.08.2012


Ответы (1)


Вы можете сделать это с помощью пользовательского уберспектора. Это позволяет вам настроить, как Velocity интерпретирует get/sets/iterators.

Недавно я сделал то же самое для jsonlib. Вот мой суперспектор.

package util;

import java.util.Iterator;

import net.sf.json.JSONArray;

import org.apache.velocity.util.introspection.Info;
import org.apache.velocity.util.introspection.SecureUberspector;

/**
 * Customized Velocity introspector.  Used so that FML can iterate through JSON arrays.
 */
public class CustomUberspector extends SecureUberspector
{
    @Override
    @SuppressWarnings("rawtypes")
    public Iterator getIterator(Object obj, Info i) throws Exception
    {
        if (obj instanceof JSONArray)
        {
            return new JsonArrayIterator((JSONArray) obj);
        }
        else
        {
            return super.getIterator(obj, i);
        }
    }
}

JsonArrayIterator — это просто простой итератор по массиву. если вы используете другую библиотеку JSON, просто настройте этот класс.

package util;

import java.util.Iterator;

import net.sf.json.JSONArray;
import net.sf.json.JSONException;

public class JsonArrayIterator implements Iterator<Object>
{
    private final JSONArray array;
    private int nextIndex;
    private final int length;

    public JsonArrayIterator(JSONArray array)
    {
        this.array = array;
        nextIndex = 0;
        length = array.size();
    }

    @Override
    public boolean hasNext()
    {
        return nextIndex < length;
    }

    @Override
    public Object next()
    {
        nextIndex++;
        try
        {
            return array.get(nextIndex - 1);
        }
        catch (JSONException e)
        {
            throw new IllegalStateException(e);
        }
    }

    @Override
    public void remove()
    {
        throw new UnsupportedOperationException();
    }


}

Последним шагом является указание уберспектора в ваших свойствах скорости.

runtime.introspector.uberspect=util.CustomUberspector
person Will Glass    schedule 18.08.2012