lundi 16 avril 2018

Get a string list of values from a generic object

So I have an Object that comes in that can be any of 100 different specific objects, with different elements inside it, from other objects, lists, sequences, primitives etc.

I want to strip the values in a depth first fashion to make a string of simply values with a delimiter between them. I have mapped the fields and stored them elsewhere.

Currently I get the object in and translate it to JSON using gson.toJson(); From that, I cycle through the JSON to get values using the code below. Issue is, this code is very CPU intensive on the low end CPU I am developing for due to the fact that there are many samples coming in per second. Overall purpose of the application is a data recorder that records real time samples into a SQLite database. I have also attempted to store the unmodified JSON into a SQLite BLOB column, but this is terribly inefficient with regards to DB size. Is there a better/more efficient method for getting values out of an object?

I don't have an issue storing the field mapping since it only needs to be done once, but the value stripping needs to be done for every sample. I know you can do it via reflection as well, but that is also processing heavy. Anyone have a better method?

public static List<String> stripValuesFromJson(JsonElement json)
{
    // Static array list that will have the values added to it. This will
    // be the return object
    List<String> dataList = new ArrayList<String>();

    // Iterate through the JSONElement and start parsing out values
    for (Entry<String, JsonElement> entry : ((JsonObject) json).entrySet())
    {
        // Call the recursive processor that will parse out items based on their individual type: primitive, array, seq etc
        dataList.addAll(dataParser(entry.getValue()));
    }

    return dataList;
}

/**
 * The actual data processor that parses out individual values and deals with every possible type of data that can come in.
 * 
 * @param json - The json object being recursed through
 * @return - return the list of values
 */
public static List<String> dataParser(JsonElement json)
{
    List<String> dataList = new ArrayList<String>();

    // Deal with primitives
    if (json instanceof JsonPrimitive)
    {
        // Deal with items that come up as true/false.
        if (json.getAsString().equals("false"))
        {
            dataList.add("0");
        } else if (json.getAsString().equals("true"))
        {
            dataList.add("1");
        } else
        {
            dataList.add(json.getAsString());
        }
        // Send through recursion to get the primitives or objects out of this object
    } else if (json instanceof JsonObject)
    {
        dataList.addAll(stripValuesFromJson(json));
    } else if (json instanceof JsonArray)
    {
        // Send through recursion for each element in this array/sequence
        for (JsonElement a : (JsonArray) json)
        {
            dataList.addAll(dataParser(a));
        }
    } else if (json instanceof JsonNull)
    {
        dataList.add(null);
    } else
    {
        errorLog.error("Unknown JSON type: " + json.getClass());
    }

    return dataList;
}





Aucun commentaire:

Enregistrer un commentaire