【问题标题】:MsgPack Serialize a JsonObject in AndroidMsgPack 在 Android 中序列化一个 JsonObject
【发布时间】:2016-08-04 10:11:00
【问题描述】:

我有一个包含多个 JsonArrays 的 JsonObject:

{
    "key1" : [[1, 2, 3, 4]],
    "key2" : [[1, 2, 3, 4]]
}

我想用MessagePack 不使用 JsonObjects字符串表示

到目前为止,我还没有找到任何有关如何完成此操作的文档,

有什么想法吗?

【问题讨论】:

    标签: java android json msgpack


    【解决方案1】:

    为了实现这一点,我编写了一个递归代码,

    如果其他人遇到此问题,这里是代码:

    public byte[] convert(JSONObject data) throws IOException, JSONException {
        MessageBufferPacker packer = MessagePack.newDefaultBufferPacker();
        packJObject(packer, data);
        packer.close();
        return packer.toByteArray();
    }
    
    private void packJObject(MessageBufferPacker packer, JSONObject data) throws IOException, JSONException {
        packer.packMapHeader(data.length());
        Iterator<String> keys = data.keys();
        while(keys.hasNext()) {
            String key = keys.next();
            packer.packString(key); // pack the key
            Object value = data.get(key);
            if(value instanceof JSONArray) {
                packJArray(packer, (JSONArray)value);
            }
            else if(value instanceof JSONObject) {
                packJObject(packer, (JSONObject) value);
            }
            else {
                packPrimitive(packer, value);
            }
        }
    }
    
    private void packJArray(MessageBufferPacker packer, JSONArray data) throws IOException, JSONException {
        packer.packArrayHeader(data.length());
        for(int i = 0; i < data.length(); i++) {
            Object value = data.get(i);
            if(value instanceof JSONObject) {
                packJObject(packer,(JSONObject)value);
            }
            else if(value instanceof JSONArray){
                packJArray(packer,(JSONArray)value);
            }
            else {
                packPrimitive(packer, value);
            }
        }
    }
    
    private void packPrimitive(MessageBufferPacker packer, Object value) throws IOException {
        if(value instanceof String) {
            packer.packString((String)value);
        }
        else if(value instanceof Integer) {
            packer.packInt((Integer) value);
        }
        else if(value instanceof Boolean) {
            packer.packBoolean((boolean)value);
        }
        else if(value instanceof Double) {
            packer.packDouble((double)value);
        }
        else if(value instanceof Long) {
            packer.packLong((long)value);
        }
        else {
            throw new IOException("Invalid packing value of type " + value.getClass().getName());
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-18
      相关资源
      最近更新 更多