【我的Android進階之旅】如何壓縮Json格式數(shù)據(jù)纫谅,減少Json數(shù)據(jù)的體積?

一溅固、背景

最近剛剛做完一個中文漢字筆畫排序的功能付秕,鏈接如下:

其中優(yōu)化之后,將數(shù)據(jù)庫的內(nèi)容励幼,序列化成為了json數(shù)據(jù)汰寓,然后通過解析json數(shù)據(jù),拿到漢字筆畫的相關(guān)信息苹粟。但是未處理前的json文件有滑,體積較大,有2.13Mb嵌削,因此需要壓縮才行毛好。

部分數(shù)據(jù)如下所示:

在這里插入圖片描述
{
      "33828": {
        "code": "33828",
        "name": "螢",
        "order": "7298",
        "strokeSum": "11"
      },
      "22920": {
        "code": "22920",
        "name": "媽",
        "order": "1051",
        "strokeSum": "6"
      },
      "20718": {
        "code": "20718",
        "name": "僮",
        "order": "13341",
        "strokeSum": "14"
      },
      "30615": {
        "code": "30615",
        "name": "瞗",
        "order": "15845",
        "strokeSum": "16"
      },
      "36969": {
        "code": "36969",
        "name": "適",
        "order": "13506",
        "strokeSum": "14"
      }
}

二、常規(guī)壓縮json

2.1 未處理前的json文件

未處理前的json文件苛秕,格式好看但是體積較大肌访。

在這里插入圖片描述
在這里插入圖片描述

未處理前的json文件,一共占用125414行


在這里插入圖片描述

未處理的原始json文件大小為2.13Mb


在這里插入圖片描述

2.2 將JSON壓縮成一行艇劫,去掉換行和空格字符

在這里插入圖片描述

在Android Studio中打開吼驶,如下所示:

在這里插入圖片描述

將JSON壓縮成一行,去掉換行和空格字符后的json文件大小為:1.39Mb,只之前的2.13Mb小了整整0.74Mb蟹演,這個在移動端是很可觀的優(yōu)化风钻!

在這里插入圖片描述

2.3 將JSON的key進行縮短

json 是 key-value 結(jié)構(gòu),如果定義好規(guī)范酒请,則可以將 key 盡量縮短骡技,甚至是無意義的字母,但前提是文檔一定要寫清楚羞反,避免不必要的麻煩布朦。

比如之前的 key-value結(jié)構(gòu)如下所示:


在這里插入圖片描述
{
      "33828": {
        "code": "33828",
        "name": "螢",
        "order": "7298",
        "strokeSum": "11"
      },
      "22920": {
        "code": "22920",
        "name": "媽",
        "order": "1051",
        "strokeSum": "6"
      },
      "20718": {
        "code": "20718",
        "name": "僮",
        "order": "13341",
        "strokeSum": "14"
      },
      "30615": {
        "code": "30615",
        "name": "瞗",
        "order": "15845",
        "strokeSum": "16"
      },
      "36969": {
        "code": "36969",
        "name": "適",
        "order": "13506",
        "strokeSum": "14"
      }
}

現(xiàn)在我們將key進行優(yōu)化,使用

c 代替 code
n 代替 name
o 代替 order
s 代替 strokeSum

在這里插入圖片描述
在這里插入圖片描述

將JSON的key進行縮短優(yōu)化后的json文件大小為:1.77Mb昼窗,只之前的2.13Mb小了整整0.36Mb是趴,這個在移動端是很可觀的優(yōu)化!

然后再將縮短key之后的文件澄惊,重復(fù)【2.2 將JSON壓縮成一行右遭,去掉換行和空格字符】的操作。

再看一看文件大小為1.04Mb缤削,比最開始的原始數(shù)據(jù)2.13Mb小了整整1.09Mb,這個在移動端是很可觀的優(yōu)化吹榴!

在這里插入圖片描述
在這里插入圖片描述

當(dāng)然這樣key的名字變化了亭敢,對應(yīng)解析Json的java實體bean也要修改一下。

因為我使用的是jackson來進行json解析的图筹,所以使用注解@JsonProperty來表示一下修改的json文件對應(yīng)原來的java bean里面的屬性帅刀,這樣解析的時候就不會出錯了。


在這里插入圖片描述

2.4 常規(guī)總結(jié)

經(jīng)過上面的常規(guī)操作远剩,
我們的json文件大小減少到了1.04Mb扣溺,
比最開始的原始數(shù)據(jù)2.13Mb
小了整整1.09Mb瓜晤,

壓縮率為51.174%锥余,壓縮后體積為原來的48.826%

已經(jīng)算很給力了,但是這個json文件還是有1.04Mb啊痢掠,是否還可以進行壓縮呢驱犹?答案是肯定的,我們下面介紹下使用算法對該json文件進行壓縮足画。

三雄驹、使用壓縮算法進行壓縮

3.1 使用Deflater壓縮json,Inflater解壓json

Deflater 是同時使用了LZ77算法哈夫曼編碼的一個無損數(shù)據(jù)壓縮算法淹辞。

在這里插入圖片描述

我們可以使用 java 提供的 Deflater 和 Inflater 類對 json 進行壓縮和解壓縮医舆,下面是工具類

package com.oyp.sort.utils;

import android.support.annotation.Nullable;
import android.util.Base64;

import java.io.ByteArrayOutputStream;
import java.util.zip.DataFormatException;
import java.util.zip.Deflater;
import java.util.zip.Inflater;

/**
 * DeflaterUtils 壓縮字符串
 */
public class DeflaterUtils {
    /**
     * 壓縮
     */
    public static String zipString(String unzipString) {
        /**
         *     https://www.yiibai.com/javazip/javazip_deflater.html#article-start
         *     0 ~ 9 壓縮等級 低到高
         *     public static final int BEST_COMPRESSION = 9;            最佳壓縮的壓縮級別。
         *     public static final int BEST_SPEED = 1;                  壓縮級別最快的壓縮。
         *     public static final int DEFAULT_COMPRESSION = -1;        默認壓縮級別蔬将。
         *     public static final int DEFAULT_STRATEGY = 0;            默認壓縮策略爷速。
         *     public static final int DEFLATED = 8;                    壓縮算法的壓縮方法(目前唯一支持的壓縮方法)。
         *     public static final int FILTERED = 1;                    壓縮策略最適用于大部分數(shù)值較小且數(shù)據(jù)分布隨機分布的數(shù)據(jù)娃胆。
         *     public static final int FULL_FLUSH = 3;                  壓縮刷新模式遍希,用于清除所有待處理的輸出并重置拆卸器。
         *     public static final int HUFFMAN_ONLY = 2;                僅用于霍夫曼編碼的壓縮策略里烦。
         *     public static final int NO_COMPRESSION = 0;              不壓縮的壓縮級別凿蒜。
         *     public static final int NO_FLUSH = 0;                    用于實現(xiàn)最佳壓縮結(jié)果的壓縮刷新模式。
         *     public static final int SYNC_FLUSH = 2;                  用于清除所有未決輸出的壓縮刷新模式; 可能會降低某些壓縮算法的壓縮率胁黑。
         */
        //使用指定的壓縮級別創(chuàng)建一個新的壓縮器废封。
        Deflater deflater = new Deflater(Deflater.BEST_COMPRESSION);
        //設(shè)置壓縮輸入數(shù)據(jù)。
        deflater.setInput(unzipString.getBytes());
        //當(dāng)被調(diào)用時丧蘸,表示壓縮應(yīng)該以輸入緩沖區(qū)的當(dāng)前內(nèi)容結(jié)束漂洋。
        deflater.finish();

        final byte[] bytes = new byte[256];
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream(256);

        while (!deflater.finished()) {
            //壓縮輸入數(shù)據(jù)并用壓縮數(shù)據(jù)填充指定的緩沖區(qū)。
            int length = deflater.deflate(bytes);
            outputStream.write(bytes, 0, length);
        }
        //關(guān)閉壓縮器并丟棄任何未處理的輸入力喷。
        deflater.end();
        return Base64.encodeToString(outputStream.toByteArray(), Base64.NO_PADDING);
    }

    /**
     * 解壓縮
     */
    @Nullable
    public static String unzipString(String zipString) {
        byte[] decode = Base64.decode(zipString, Base64.NO_PADDING);
        //創(chuàng)建一個新的解壓縮器  https://www.yiibai.com/javazip/javazip_inflater.html
        Inflater inflater = new Inflater();
        //設(shè)置解壓縮的輸入數(shù)據(jù)刽漂。
        inflater.setInput(decode);

        final byte[] bytes = new byte[256];
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream(256);
        try {
            //finished() 如果已到達壓縮數(shù)據(jù)流的末尾,則返回true弟孟。
            while (!inflater.finished()) {
                //將字節(jié)解壓縮到指定的緩沖區(qū)中贝咙。
                int length = inflater.inflate(bytes);
                outputStream.write(bytes, 0, length);
            }
        } catch (DataFormatException e) {
            e.printStackTrace();
            return null;
        } finally {
            //關(guān)閉解壓縮器并丟棄任何未處理的輸入。
            inflater.end();
        }

        return outputStream.toString();
    }
}

3.1.1 壓縮原始的stroke.json數(shù)據(jù)

然后我們先將原始的stroke.json數(shù)據(jù)壓縮成deFlaterStrokeJson.json拂募。

在這里插入圖片描述
 //原始文件   stroke.json
 String strokeJson = LocalFileUtils.getStringFormAsset(context, "stroke.json");
  mapper = JSONUtil.toCollection(strokeJson, HashMap.class, String.class, Stroke.class);
  // 使用 Deflater  加密
  String deFlaterStrokeJson = DeflaterUtils.zipString(strokeJson);
  writeFile(deFlaterStrokeJson,"deFlaterStrokeJson.json");

其中 writeFile方法是寫入到sdcard的方法庭猩。

private static void writeFile(String mapperJson, String fileName) {
        Writer write = null;
        try {
            File file = new File(Environment.getExternalStorageDirectory(), fileName);
            Log.d(TAG, "file.exists():" + file.exists() + " file.getAbsolutePath():" + file.getAbsolutePath());
            // 如果父目錄不存在,創(chuàng)建父目錄
            if (!file.getParentFile().exists()) {
                file.getParentFile().mkdirs();
            }
            // 如果已存在,刪除舊文件
            if (file.exists()) {
                file.delete();
            }
            file.createNewFile();
            // 將格式化后的字符串寫入文件
            write = new OutputStreamWriter(new FileOutputStream(file), "UTF-8");
            write.write(mapperJson);
            write.flush();
            write.close();
        } catch (Exception e) {
            Log.e(TAG, "e = " + Log.getStackTraceString(e));
        }finally {
            if (write != null){
                try {
                    write.close();
                } catch (IOException e) {
                    Log.e(TAG, "e = " + Log.getStackTraceString(e));
                }
            }
        }
    }

運行完畢之后陈症,將sdcard中的deFlaterStrokeJson.json導(dǎo)出來蔼水,放到assets目錄下,以備后續(xù)解析使用录肯。

在這里插入圖片描述

使用Deflater壓縮json趴腋,壓縮后大小為 387KB,比上一次的1067KB论咏,又少了很多很多于样。

經(jīng)過Deflater壓縮和Base64編碼之后的deFlaterStrokeJson.json文件,如下所示:

在這里插入圖片描述

3.1.2 還原成原始的stroke.json數(shù)據(jù)

關(guān)壓縮還不行潘靖,我們得使用壓縮后的json文件數(shù)據(jù)啊穿剖,因此我們還需要將壓縮后的json數(shù)據(jù)進行解壓,操作如下所示:

在這里插入圖片描述
//使用 Inflater 解密
String deFlaterStrokeJson = LocalFileUtils.getStringFormAsset(context, "deFlaterStrokeJson.json");
String strokeJson = DeflaterUtils.unzipString(deFlaterStrokeJson);
mapper = JSONUtil.toCollection(strokeJson, HashMap.class, String.class, Stroke.class);

解壓之后運行一切正常卦溢!完美糊余!

3.1.3 Deflater壓縮總結(jié)

經(jīng)過上面的常規(guī)操作秀又,
我們的json文件大小減少到了387KB
比剛才未使用壓縮算法的原始數(shù)據(jù)1067KB贬芥,
小了整整680KB吐辙,

壓縮率為63.73%,壓縮后體積為原來的36.27%

優(yōu)化步驟 體積
1.未處理的原始json 2.13MB
2.將JSON壓縮成一行蘸劈,去掉換行和空格字符 1.39MB
3.將JSON的key進行縮短 1.04MB
4.使用Deflater壓縮json,Base64編碼 0.38MB
在這里插入圖片描述
在這里插入圖片描述

3.2 使用Gzip壓縮解壓json

在我封裝的http庫里面昏苏,有對請求json數(shù)據(jù)進行Gzip壓縮,對服務(wù)器返回的json數(shù)據(jù)進行Gzip解壓威沫。這里也來試一下Gzip壓縮json贤惯。

編寫一個 Gzip壓縮解壓并使用Base64進行編碼工具類

package com.oyp.sort.utils;

import android.text.TextUtils;
import android.util.Base64;
import android.util.Log;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;

/**
 * Gzip壓縮解壓并使用Base64進行編碼工具類
 */
public class GzipUtil {
    private static final String TAG = "GzipUtil";
    /**
     * 將字符串進行g(shù)zip壓縮
     *
     * @param data
     * @param encoding
     * @return
     */
    public static String compress(String data, String encoding) {
        if (data == null || data.length() == 0) {
            return null;
        }
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        GZIPOutputStream gzip;
        try {
            gzip = new GZIPOutputStream(out);
            gzip.write(data.getBytes(encoding));
            gzip.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return Base64.encodeToString(out.toByteArray(), Base64.NO_PADDING);
    }

    public static String uncompress(String data, String encoding) {
        if (TextUtils.isEmpty(data)) {
            return null;
        }
        byte[] decode = Base64.decode(data, Base64.NO_PADDING);
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        ByteArrayInputStream in = new ByteArrayInputStream(decode);
        GZIPInputStream gzipStream = null;
        try {
            gzipStream = new GZIPInputStream(in);
            byte[] buffer = new byte[256];
            int n;
            while ((n = gzipStream.read(buffer)) >= 0) {
                out.write(buffer, 0, n);
            }
        } catch (IOException e) {
            Log.e(TAG, "e = " + Log.getStackTraceString(e));
        } finally {
            try {
                out.close();
                if (gzipStream != null) {
                    gzipStream.close();
                }
            } catch (IOException e) {
                Log.e(TAG, "e = " + Log.getStackTraceString(e));
            }

        }
        return new String(out.toByteArray(), Charset.forName(encoding));
    }

}

3.2.1 壓縮原始的stroke.json數(shù)據(jù)

在這里插入圖片描述
  //原始文件   stroke.json
String strokeJson = LocalFileUtils.getStringFormAsset(context, "stroke.json");
mapper = JSONUtil.toCollection(strokeJson, HashMap.class, String.class, Stroke.class);
// 使用 GZIP  壓縮
String gzipStrokeJson = GzipUtil.compress(strokeJson,CHARSET_NAME);
writeFile(gzipStrokeJson,"gzipStrokeJson.json");

運行完畢之后,將sdcard中的gzipStrokeJson.json導(dǎo)出來棒掠,放到assets目錄下孵构,以備后續(xù)解析使用。

在這里插入圖片描述

導(dǎo)出來的gzipStrokeJson.json文件為405kb烟很,沒有比剛才使用Deflater壓縮json后大小為 387KB優(yōu)秀颈墅!

在這里插入圖片描述

3.2.2 還原成原始的stroke.json數(shù)據(jù)

關(guān)壓縮還不行,我們得使用壓縮后的json文件數(shù)據(jù)啊雾袱,因此我們還需要將壓縮后的json數(shù)據(jù)進行解壓恤筛,操作如下所示:

在這里插入圖片描述
//使用 GZIP 解壓
String gzipStrokeJson = LocalFileUtils.getStringFormAsset(context, "gzipStrokeJson.json");
String strokeJson = GzipUtil.uncompress(gzipStrokeJson,CHARSET_NAME);
mapper = JSONUtil.toCollection(strokeJson, HashMap.class, String.class, Stroke.class);

解壓之后,json解析一切正常芹橡!

3.2.3 Gzip壓縮總結(jié)

經(jīng)過上面的常規(guī)操作叹俏,
我們的json文件大小減少到了405kb
雖然比不上剛才的Deflater壓縮:387KB僻族,
但是比剛才未使用壓縮算法的原始數(shù)據(jù)1067KB
小了整整662KB屡谐,

壓縮率為62.04%述么,壓縮后體積為原來的37.95%,也是不錯的愕掏!

四度秘、 其他壓縮算法

除了上面的算法之外,我們還可以使用很多其他的壓縮算法饵撑,進一步壓縮json的體積剑梳。我們的原始json中還是有很多重復(fù)的key值可以進行優(yōu)化的,下面的算法中有部分可以進行key優(yōu)化滑潘!

常見的json壓縮算法有CJSON與HPack垢乙,其原理都是將key和value進行抽離,節(jié)省掉部分的重復(fù)的key值造成的空間消耗语卤。

4.1 CJSON

CJSON 的壓縮算法, 主要是將資料抽離成 Template 與 Value,節(jié)省掉重復(fù)的 "Key 值".

原始JSON:

[{
        "x": 100,
        "y": 100
    },
    {
        "x": 100,
        "y": 100,
        "width": 200,
        "height": 150
    },
    {}
]
在這里插入圖片描述

CJSON壓縮后:

{
    "templates": [
        [0, "x", "y"],
        [1, "width", "height"]
    ],
    "values": [{
            "values": [1, 100, 100]
        },
        {
            "values": [2, 100, 100, 200, 150]
        },
        {}
    ]
}
在這里插入圖片描述

4.2 HPack

HPack 的壓縮算法, 也是將 Key, Value 抽離, 陣列中第一個值, 就是 HPack 的 Template, 后面依序就是 Value.

[
    {
         "name": "Andrea",
         "age": 31,
         "gender": "Male",
         "skilled": true
    },
    {
         "name": "Eva",
         "age": 27,
         "gender": "Female",
         "skilled": true
    },
    {
         "name": "Daniele",
         "age": 26,
         "gender": "Male",
         "skilled": false
    }
]
在這里插入圖片描述

壓縮之后的數(shù)據(jù)

[
    [
        "name",
        "age",
        "gender",
        "skilled"
    ],
    [
        "Andrea",
        31,
        "Male",
        true
    ],
    [
        "Eva",
        27,
        "Female",
        true
    ],
    [
        "Daniele",
        26,
        "Male",
        false
    ]
]
在這里插入圖片描述

兩種方法都是主要講json 的 鍵抽出來統(tǒng)一建成索引追逮,只是最后的格式不同酪刀。

HPack 簡化后的格式比CJSON 少了許多字符,所以HPack 的壓縮效率比較高钮孵。數(shù)據(jù)量越大骂倘,效果越明顯,應(yīng)用場景也更加有意義巴席。

如果 JSON 內(nèi)容太少, CJSON的資料可能反而會比較多历涝。

壓縮效果

下圖來自:https://www.oschina.net/p/jsonhpack

在這里插入圖片描述

五、參考資料

在這里插入圖片描述

image

作者:歐陽鵬 歡迎轉(zhuǎn)載,與人分享是進步的源泉毡证!
轉(zhuǎn)載請保留原文地址:https://blog.csdn.net/qq446282412/article/details/83856439
? 本人QQ: 3024665621
? QQ交流群: 123133153
? github.com/ouyangpeng
? oypcz@foxmail.com
如果本文對您有所幫助电爹,歡迎您掃碼下圖所示的支付寶和微信支付二維碼對本文進行打賞。

image
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末料睛,一起剝皮案震驚了整個濱河市丐箩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌恤煞,老刑警劉巖屎勘,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異居扒,居然都是意外死亡概漱,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進店門喜喂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瓤摧,“玉大人,你說我怎么就攤上這事玉吁≌彰郑” “怎么了?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵进副,是天一觀的道長这揣。 經(jīng)常有香客問我,道長影斑,這世上最難降的妖魔是什么给赞? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮矫户,結(jié)果婚禮上片迅,老公的妹妹穿的比我還像新娘。我一直安慰自己皆辽,他們只是感情好障涯,可當(dāng)我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布罐旗。 她就那樣靜靜地躺著,像睡著了一般唯蝶。 火紅的嫁衣襯著肌膚如雪九秀。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天粘我,我揣著相機與錄音鼓蜒,去河邊找鬼。 笑死征字,一個胖子當(dāng)著我的面吹牛都弹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播匙姜,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼畅厢,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了氮昧?” 一聲冷哼從身側(cè)響起框杜,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎袖肥,沒想到半個月后咪辱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡椎组,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年油狂,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片寸癌。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡专筷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蒸苇,到底是詐尸還是另有隱情磷蛹,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布填渠,位于F島的核電站,受9級特大地震影響鸟辅,放射性物質(zhì)發(fā)生泄漏氛什。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一匪凉、第九天 我趴在偏房一處隱蔽的房頂上張望枪眉。 院中可真熱鬧,春花似錦再层、人聲如沸贸铜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蒿秦。三九已至烤镐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間棍鳖,已是汗流浹背炮叶。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留渡处,地道東北人镜悉。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像医瘫,于是被迫代替她去往敵國和親侣肄。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,515評論 2 359

推薦閱讀更多精彩內(nèi)容

  • [筆記]Android性能優(yōu)化 上[筆記]Android性能優(yōu)化 中[筆記]Android性能優(yōu)化 下 7.And...
    幻海流心閱讀 936評論 0 8
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理醇份,服務(wù)發(fā)現(xiàn)稼锅,斷路器,智...
    卡卡羅2017閱讀 134,701評論 18 139
  • 關(guān)于Mongodb的全面總結(jié) MongoDB的內(nèi)部構(gòu)造《MongoDB The Definitive Guide》...
    中v中閱讀 31,947評論 2 89
  • 一被芳、壓縮算法 1.zip 以下參考他發(fā)明了 zip 壓縮格式缰贝,功成名就之際死于墮落壓縮大戰(zhàn)真相 轉(zhuǎn)載自2004.1...
    合肥黑閱讀 5,905評論 0 5
  • 1、通過CocoaPods安裝項目名稱項目信息 AFNetworking網(wǎng)絡(luò)請求組件 FMDB本地數(shù)據(jù)庫組件 SD...
    陽明先生_X自主閱讀 15,988評論 3 119