如何在类型响应时解析JSON响应

时间:2013-09-13 07:31:34

标签: android json

我正在接受来自网络服务电话的json响应。 正如您所看到的,我们将在响应中获得什么类型的值也会出现在类型对象中。

 {"settings":[
    {
    "name":"name1",
    "value":4,
    "type":"int"
    },
    {
    "name":"name2",
    "value":false,
    "type":"boolean"
    },
    {
    "name":"name3",
    "type":"array",
    "value":[
    {
    "name":"name3"
    }]}]}
  1. 如何解析这个json?
  2. 如何在数据库中存储已解析的值,其中我有一个列名为name,value等的表?
  3. 编辑:

    目前我正在将所有值转换为字符串,因为我们无法将boolean添加到数据库。

    private enum Type{
        INT("int"), BOOLEAN("boolean"), ARRAY("array"),UNKNOWN_TYPE("");
    
        private String mType;
        Type(String type){
            mType = type;
        }
    
        public static Type toEnum(String type){
            for (Type value: Type.values()){
                if(value.mType.equals(type)){
                    return value;
                }
            }
            return UNKNOWN_TYPE;
        }
    }
    
    
    
                    String value = null;
                    switch (Type.toEnum(type)){
                        case INT:
                            value = String.valueOf(setting.getInt("value"));
                            break;
                        case BOOLEAN:
                            value = String.valueOf(setting.getBoolean("value"));
                            break;
                        case ARRAY:
                            parseJsonArray();
                            break;
    
                    }
    

    这是正确的方法吗?

1 个答案:

答案 0 :(得分:1)

处理可能是少数类型的数据项的常用方法是使用tagged union。在Java中,你会写一个这样的东西:

// CREATE TABLE dataFromJson (type ENUM('INT', 'BOOLEAN', 'STRING'),
//                            intval INT, boolval INT, stringval LONGTEXT);

class DataItem {
    public enum Type { INT, BOOLEAN, STRING };
    public Type m_type;
    public int m_int;
    public bool m_boolean;
    public String m_string;
    public PreparedStatement toInsertQuery(Connection conn) {
        PreparedStatement ps = conn.prepareStatement("INSERT INTO dataFromJson VALUES (?, ?, ?, ?)");
        ps.setString(1, m_type.toString());
        if (m_type==INT) ps.setInt(2, m_int); else ps.setObject(2, null);
        if (m_type==BOOLEAN) ps.setBoolean(3, m_boolean); else ps.setObject(3, null);
        if (m_type==STRING) ps.setString(4, m_string); else ps.setObject(4, null); 
        return ps;
    }
}

处理JSON数组(和对象)要复杂得多;首先,您必须弄清楚您希望如何表示数据。你想将整个数组作为字符串吗?你想让数组的第一个 N 元素“爆炸”成各个列吗?是否要存储单个整数array_id,这是一个单独且更复杂的表ArrayValues的主键?你可以在这里做各种各样的事情......在哲学层面上,没有一件事令人非常满意。这取决于您以后要对数据做些什么。