Опитвам се да итерирам JSONArray в шаблон за скорост, но не работи. Открих, че шаблонът за скорост може да итерира колекция, масив, хеш-карта обекти Всеки може да ми помогне да итерирам JSONArray
Благодаря предварително
Опитвам се да итерирам JSONArray в шаблон за скорост, но не работи. Открих, че шаблонът за скорост може да итерира колекция, масив, хеш-карта обекти Всеки може да ми помогне да итерирам JSONArray
Благодаря предварително
Можете да направите това с персонализиран uberspector. Това ви позволява да персонализирате как Velocity интерпретира get/sets/iterators.
Направих точно същото нещо наскоро за jsonlib. Ето го моят uberspector.
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();
}
}
Последната стъпка е да посочите uberspector във вашите свойства на скоростта.
runtime.introspector.uberspect=util.CustomUberspector