All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.firefly.utils.json.parser.ArrayParser Maven / Gradle / Ivy

There is a newer version: 5.0.2
Show newest version
package com.firefly.utils.json.parser;

import com.firefly.utils.ReflectUtils;
import com.firefly.utils.exception.CommonRuntimeException;
import com.firefly.utils.json.JsonReader;
import com.firefly.utils.json.Parser;
import com.firefly.utils.json.exception.JsonException;
import com.firefly.utils.json.support.ParserMetaInfo;

import java.io.IOException;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.List;

public class ArrayParser implements Parser {

    private ParserMetaInfo elementMetaInfo;

    public ArrayParser(Class clazz) {
        elementMetaInfo = new ParserMetaInfo();
        elementMetaInfo.setType(clazz);
        elementMetaInfo.setParser(ParserStateMachine.getParser(clazz, null));
    }

    @Override
    public Object convertTo(JsonReader reader, Class clazz) throws IOException {
        if (reader.isNull())
            return null;

        if (!reader.isArray())
            throw new JsonException("json string is not array format");

        if (reader.isEmptyArray())
            return Array.newInstance(elementMetaInfo.getType(), 0);

        List obj = new ArrayList();

        for (; ; ) {
            obj.add(elementMetaInfo.getValue(reader));

            char ch = reader.readAndSkipBlank();
            if (ch == ']')
                return copyOf(obj);

            if (ch != ',')
                throw new JsonException("missing ','");
        }
    }

    public Object copyOf(List list) {
        Object ret = Array.newInstance(elementMetaInfo.getType(), list.size());
        for (int i = 0; i < list.size(); i++) {
            try {
                ReflectUtils.arraySet(ret, i, list.get(i));
            } catch (Throwable e) {
                throw new CommonRuntimeException(e);
            }
        }
        return ret;
    }

}