【问题标题】:How to parse a JSON response when type is also coming in response当类型也响应时如何解析 JSON 响应
【发布时间】:2013-09-13 07:31:33
【问题描述】:

我收到来自 Web 服务调用的以下 json 响应。 正如你所看到的,我们将得到什么类型的值作为响应也来自类型对象。

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

编辑:

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

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;

                }

这是正确的方法吗?

【问题讨论】:

  • 它是一个错误的 Json 请先检查 json
  • 这是一个jsonarray,所以你解析它,每个单元格为Object,用它构造一个Object数组。将其转换为您创建并具有这 3 个属性的自定义类型(例如:jsoncustomobject)。然后你可以根据每个类型创建一个数组
  • 使用这个在线工具来解析/检查你的 json:jsonlint.com
  • 这只是大json的一部分,给你一个想法。
  • 你试过了吗?

标签: android json


【解决方案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的主键吗?你可以在这里做各种各样的事情……在哲学层面上,没有一个是非常令人满意的。这取决于您以后要如何处理这些数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-27
    • 1970-01-01
    • 2018-12-17
    • 2013-03-27
    相关资源
    最近更新 更多