精华内容
下载资源
问答
  • 杰森·拉链 使用zip和gzip压缩json文件未更新
  • 部分数据如下所示: 二、常规压缩json 2.1 未处理前的json文件 未处理前的json文件,格式好看但是体积较大。 未处理前的json文件,一共占用125414行 未处理的原始json文件大小为2.13Mb 2.2 将JSON压缩成一行,去掉...

    一、背景

    最近刚刚做完一个中文汉字笔画排序的功能,链接如下:

    其中优化之后,将数据库的内容,序列化成为了json数据,然后通过解析json数据,拿到汉字笔画的相关信息。但是未处理前的json文件,体积较大,有2.13Mb,因此需要压缩才行。

    部分数据如下所示:

    在这里插入图片描述

    {
    	  "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"
    	  }
    }
    
      
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    二、常规压缩json

    2.1 未处理前的json文件

    未处理前的json文件,格式好看但是体积较大。

    在这里插入图片描述

    在这里插入图片描述
    未处理前的json文件,一共占用125414行
    在这里插入图片描述

    未处理的原始json文件大小为2.13Mb
    在这里插入图片描述

    2.2 将JSON压缩成一行,去掉换行和空格字符

    在这里插入图片描述

    在Android Studio中打开,如下所示:

    在这里插入图片描述

    将JSON压缩成一行,去掉换行和空格字符后的json文件大小为:1.39Mb,只之前的2.13Mb小了整整0.74Mb,这个在移动端是很可观的优化!

    在这里插入图片描述

    2.3 将JSON的key进行缩短

    json 是 key-value 结构,如果定义好规范,则可以将 key 尽量缩短,甚至是无意义的字母,但前提是文档一定要写清楚,避免不必要的麻烦。

    比如之前的 key-value结构如下所示:
    在这里插入图片描述

    {
    	  "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"
    	  }
    }
    
      
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    现在我们将key进行优化,使用

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

    在这里插入图片描述

    在这里插入图片描述

    将JSON的key进行缩短优化后的json文件大小为:1.77Mb,只之前的2.13Mb小了整整0.36Mb,这个在移动端是很可观的优化!

    然后再将缩短key之后的文件,重复【2.2 将JSON压缩成一行,去掉换行和空格字符】的操作。

    再看一看文件大小为1.04Mb,比最开始的原始数据2.13Mb小了整整1.09Mb,这个在移动端是很可观的优化!

    在这里插入图片描述

    在这里插入图片描述

    当然这样key的名字变化了,对应解析Json的java实体bean也要修改一下。

    因为我使用的是jackson来进行json解析的,所以使用注解@JsonProperty来表示一下修改的json文件对应原来的java bean里面的属性,这样解析的时候就不会出错了。
    在这里插入图片描述

    2.4 常规总结

    经过上面的常规操作,
    我们的json文件大小减少到了1.04Mb
    比最开始的原始数据2.13Mb
    小了整整1.09Mb

    压缩率为51.174%,压缩后体积为原来的48.826%

    已经算很给力了,但是这个json文件还是有1.04Mb啊,是否还可以进行压缩呢?答案是肯定的,我们下面介绍下使用算法对该json文件进行压缩。

    三、使用压缩算法进行压缩

    3.1 使用Deflater压缩json,Inflater解压json

    Deflater 是同时使用了LZ77算法哈夫曼编码的一个无损数据压缩算法

    在这里插入图片描述

    我们可以使用 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;                    压缩策略最适用于大部分数值较小且数据分布随机分布的数据。
          
        • 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;                    用于实现最佳压缩结果的压缩刷新模式。
          
        • public static final int SYNC_FLUSH = 2;                  用于清除所有未决输出的压缩刷新模式; 可能会降低某些压缩算法的压缩率。
          

        */
        //使用指定的压缩级别创建一个新的压缩器。
        Deflater deflater = new Deflater(Deflater.BEST_COMPRESSION);
        //设置压缩输入数据。
        deflater.setInput(unzipString.getBytes());
        //当被调用时,表示压缩应该以输入缓冲区的当前内容结束。
        deflater.finish();

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

        while (!deflater.finished()) {
        //压缩输入数据并用压缩数据填充指定的缓冲区。
        int length = deflater.deflate(bytes);
        outputStream.write(bytes, 0, length);
        }
        //关闭压缩器并丢弃任何未处理的输入。
        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);
        //创建一个新的解压缩器 https://www.yiibai.com/javazip/javazip_inflater.html
        Inflater inflater = new Inflater();
        //设置解压缩的输入数据。
        inflater.setInput(decode);

        final byte[] bytes = new byte[256];
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream(256);
        try {
        //finished() 如果已到达压缩数据流的末尾,则返回true。
        while (!inflater.finished()) {
        //将字节解压缩到指定的缓冲区中。
        int length = inflater.inflate(bytes);
        outputStream.write(bytes, 0, length);
        }
        } catch (DataFormatException e) {
        e.printStackTrace();
        return null;
        } finally {
        //关闭解压缩器并丢弃任何未处理的输入。
        inflater.end();
        }

        return outputStream.toString();
        }
        }

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84

    3.1.1 压缩原始的stroke.json数据

    然后我们先将原始的stroke.json数据压缩成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");
    
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    其中 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());
                // 如果父目录不存在,创建父目录
                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));
                    }
                }
            }
        }
    
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    运行完毕之后,将sdcard中的deFlaterStrokeJson.json导出来,放到assets目录下,以备后续解析使用。

    在这里插入图片描述

    使用Deflater压缩json,压缩后大小为 387KB,比上一次的1067KB,又少了很多很多。

    经过Deflater压缩和Base64编码之后的deFlaterStrokeJson.json文件,如下所示:

    在这里插入图片描述

    3.1.2 还原成原始的stroke.json数据

    关压缩还不行,我们得使用压缩后的json文件数据啊,因此我们还需要将压缩后的json数据进行解压,操作如下所示:

    在这里插入图片描述

    //使用 Inflater 解密
    String deFlaterStrokeJson = LocalFileUtils.getStringFormAsset(context, "deFlaterStrokeJson.json");
    String strokeJson = DeflaterUtils.unzipString(deFlaterStrokeJson);
    mapper = JSONUtil.toCollection(strokeJson, HashMap.class, String.class, Stroke.class);
    
     
    • 1
    • 2
    • 3
    • 4

    解压之后运行一切正常!完美!

    3.1.3 Deflater压缩总结

    经过上面的常规操作,
    我们的json文件大小减少到了387KB
    比刚才未使用压缩算法的原始数据1067KB
    小了整整680KB

    压缩率为63.73%,压缩后体积为原来的36.27%

    优化步骤体积
    1.未处理的原始json2.13MB
    2.将JSON压缩成一行,去掉换行和空格字符1.39MB
    3.将JSON的key进行缩短1.04MB
    4.使用Deflater压缩json,Base64编码0.38MB

    在这里插入图片描述

    在这里插入图片描述

    3.2 使用Gzip压缩解压json

    在我封装的http库里面,有对请求json数据进行Gzip压缩,对服务器返回的json数据进行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”;
      /
      *

      • 将字符串进行gzip压缩
      • @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));
      }

       <span class="token punctuation">}</span>
       <span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">String</span><span class="token punctuation">(</span>out<span class="token punctuation">.</span><span class="token function">toByteArray</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> Charset<span class="token punctuation">.</span><span class="token function">forName</span><span class="token punctuation">(</span>encoding<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      

      }

    }

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74

    3.2.1 压缩原始的stroke.json数据

    在这里插入图片描述

      //原始文件   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");
    
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    运行完毕之后,将sdcard中的gzipStrokeJson.json导出来,放到assets目录下,以备后续解析使用。

    在这里插入图片描述

    导出来的gzipStrokeJson.json文件为405kb,没有比刚才使用Deflater压缩json后大小为 387KB优秀!

    在这里插入图片描述

    3.2.2 还原成原始的stroke.json数据

    关压缩还不行,我们得使用压缩后的json文件数据啊,因此我们还需要将压缩后的json数据进行解压,操作如下所示:

    在这里插入图片描述

    //使用 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);
    
     
    • 1
    • 2
    • 3
    • 4

    解压之后,json解析一切正常!

    3.2.3 Gzip压缩总结

    经过上面的常规操作,
    我们的json文件大小减少到了405kb
    虽然比不上刚才的Deflater压缩:387KB
    但是比刚才未使用压缩算法的原始数据1067KB
    小了整整662KB

    压缩率为62.04%,压缩后体积为原来的37.95%,也是不错的!

    四、 其他压缩算法

    除了上面的算法之外,我们还可以使用很多其他的压缩算法,进一步压缩json的体积。我们的原始json中还是有很多重复的key值可以进行优化的,下面的算法中有部分可以进行key优化!

    https://web-resource-optimization.blogspot.com/2011/06/json-compression-algorithms.html

    常见的json压缩算法有CJSON与HPack,其原理都是将key和value进行抽离,节省掉部分的重复的key值造成的空间消耗。

    4.1 CJSON

    CJSON 的压缩算法, 主要是将资料抽离成 Template 与 Value,节省掉重复的 “Key 值”.

    原始JSON:

    [{
    		"x": 100,
    		"y": 100
    	},
    	{
    		"x": 100,
    		"y": 100,
    		"width": 200,
    		"height": 150
    	},
    	{}
    ]
    
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在这里插入图片描述
    CJSON压缩后:

    {
    	"templates": [
    		[0, "x", "y"],
    		[1, "width", "height"]
    	],
    	"values": [{
    			"values": [1, 100, 100]
    		},
    		{
    			"values": [2, 100, 100, 200, 150]
    		},
    		{}
    	]
    }
    
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在这里插入图片描述

    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
        }
    ]
    
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    在这里插入图片描述

    压缩之后的数据

    [
        [
            "name",
            "age",
            "gender",
            "skilled"
        ],
        [
            "Andrea",
            31,
            "Male",
            true
        ],
        [
            "Eva",
            27,
            "Female",
            true
        ],
        [
            "Daniele",
            26,
            "Male",
            false
        ]
    ]
    
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    在这里插入图片描述

    两种方法都是主要讲json 的 键抽出来统一建成索引,只是最后的格式不同。

    HPack 简化后的格式比CJSON 少了许多字符,所以HPack 的压缩效率比较高。数据量越大,效果越明显,应用场景也更加有意义。

    如果 JSON 内容太少, CJSON的资料可能反而会比较多。

    压缩效果

    下图来自:https://www.oschina.net/p/jsonhpack
    在这里插入图片描述

    五、参考资料

    在这里插入图片描述


    作者:欧阳鹏 欢迎转载,与人分享是进步的源泉!

    展开全文
  • lottie 动画的json文件

    2019-11-26 11:57:19
    这是一个json格式的动画,仅在demo中使用噢这是一个json格式的动画,
  • 全国地图json文件.zip

    2020-09-08 16:02:20
    全国+各省+各市+各区级地图json文件,都是干货需要的可以给个关注免费拿! 免费!!!免费!!!免费!!!重要的事情说四遍。
  • json 压缩算法

    万次阅读 2018-04-07 14:52:10
    无论使用何种编程语言,json格式的数据已被广泛应用,不论是数据的传输还是存储,在很多应用场景下,你可能想进一步地压缩JSON字符串的长度,以提升传输效率,如果你使用的是nosql数据库,你可能想进一步的压缩json...

    无论使用何种编程语言,json格式的数据已被广泛应用,不论是数据的传输还是存储,在很多应用场景下,你可能想进一步地压缩JSON字符串的长度,以提升传输效率,如果你使用的是nosql数据库,你可能想进一步的压缩json字符串的长度来节省你的存储空间,接下来,我将介绍一下目前最常用的json数据压缩技术(CJSON和HPack)的实现(文章最后有彩蛋哦)。

    一、CJSON

    CJSON 的压缩算法, 主要是将资料抽离成 Template Value,节省掉重复的 "Key ".

    原数据:

    [

      {     "x": 100,

        "y": 100

      }, {   "x": 100,

        "y": 100,

        "width": 200,

        "height": 150

      },

      {},

    ]

    压缩之后:

    {

      "templates": [

        [0, "x", "y"], [1,"width", "height"]

      ],

      "values": [

        { "values": [ 1,  100, 100 ] },

        { "values": [2, 100, 100, 200,150 ] },

        {}

      ]

    }

           二、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

    }]

    压缩之后:

    [["name","age","gender","skilled"],["Andrea",31,"Male",true],["Eva",27,"Female",true],["Daniele",26,"Male",false]]

    结论
    两种方法都是主要讲json 的 键抽出来统一建成索引,只是最后的格式不同,HPack 简化后的格式比CJSON 少了许多字符,所以HPack 的压缩效率比较高, 如果 JSON 内容太少, CJSON的资料可能反而会比较多。

    三、彩蛋

    我在研究开源性能分析工具pinpoint的源码时,发现了里面有使用一种压缩比更高的做法,

    例如:

    原数据:

    {

      name : "Andrea",

      age : 31,

      gender : "Male",

      skilled : true

    }

    压缩后的示意图如下:


    压缩之后的数据变成了一串二进制数据,其中 name gender 由于是 string 类型,长度不定,故使用他们的第一个四位数作为表示这个该name 对应值Andrea”的二进制长度,其他类型的数据取值如下图的API


            这样的做法可以被认为是一种加密性质的压缩,如果数据接收方不知道数据结构,是无法直接解析出目标值的。需要数据发送发和数据接收方约定好字段的结构。

           从上面的例子中,我们发现,CJSOHPack 都只是节省了 json数据键的大小,但是里面的中括号和引号都无用且大量冗余,我上面介绍的这种压缩方法使用起来复杂度可能高一点,但是压缩比可以比上面的两种更好一些,不管是作为存储还是作为数据的传输,都可以节省大量的资源。

    展开全文
  • "encoding/json" ) type Items []Item type CreateData struct { Items []Item } type Item struct { Id enter code herestring `json:"id" required:"true"` CompCd string `json:"compCd" required:"true"`...
  • 因为平时需要查看json内容,有时候修改后需要压缩json,虽然已经有网页可以实现,但每次打开网页也很麻烦啊。虽然notpad++也有NPPJSONViewer这个插件,但是目前只有格式化json的功能,没有压缩json的功能。这就比较...

    1.遇到问题

    因为平时需要查看json内容,有时候修改后需要压缩json,虽然已经有网页可以实现,但每次打开网页也很麻烦啊。虽然notpad++也有NPPJSONViewer这个插件,但是目前只有格式化json的功能,没有压缩json的功能。这就比较蛋疼咯。

    2.解决方案

    set compact=c
    
    text_saveto D:\tmp.json
    cmd /C "jq -r$(compact) . D:\tmp.json > D:\dst.json"
    if $(EXITCODE)==0
      text_loadfrom D:\dst.json
    endif
    

    上述代码是编辑在nppexec运行时的那个输入框中。需要用到的工具有jq,大家可以去官网下载吧。
    当"set compact=c"时为压缩json,当"set compact="时为格式化json,现在可以愉快的编辑json文本咯。另外如果编写的json格式有问题,在格式化或者压缩的时候会报错,这样也帮忙检查了一下有没有手误。

    展开全文
  • C# Json压缩和格式化

    2021-04-16 14:00:48
    c# Json压缩和格式化Json压缩和格式化Json压缩Json格式化 Json压缩和格式化 Json作为常用数据文件,在传输过程前或传输后要进行压缩或者格式化,以方便自己使用。下面是使用C#完成的格式化和压缩代码。 Json压缩 //...

    Json压缩和格式化

    Json作为常用数据文件,在传输过程前或传输后要进行压缩或者格式化,以方便自己使用。下面是使用C#完成的格式化和压缩代码。

    Json压缩

            /// <summary>
            /// 压缩Json字符串
            /// </summary>
            /// <param name="json">需要压缩的json串</param>
            /// <returns></returns>
            public static string Compress(string json)
            {
                StringBuilder sb = new StringBuilder();
                using (StringReader reader = new StringReader(json))
                {
                    int ch = -1;
                    int lastch = -1;
                    bool isQuoteStart = false;
                    while ((ch = reader.Read()) > -1)
                    {
                        if ((char)lastch != '\\' && (char)ch == '\"')
                        {
                            if (!isQuoteStart)
                            {
                                isQuoteStart = true;
                            }
                            else
                            {
                                isQuoteStart = false;
                            }
                        }
                        if (!Char.IsWhiteSpace((char)ch) || isQuoteStart)
                        {
                            sb.Append((char)ch);
                        }
                        lastch = ch;
                    }
                }
                return sb.ToString();
            }
    

    Json格式化

    		/// <summary>
            /// 格式化Json字符串
            /// </summary>
            /// <param name="str">需要格式化的json串</param>
            /// <returns>格式化完成的json</returns>
     		public static string ConvertJsonString(string str)
            {
                JsonSerializer serializer = new JsonSerializer();
                TextReader tr = new StringReader(str);
                JsonTextReader jtr = new JsonTextReader(tr);
                object obj = serializer.Deserialize(jtr);
                if (obj != null)
                {
                    StringWriter textWriter = new StringWriter();
                    JsonTextWriter jsonWriter = new JsonTextWriter(textWriter)
                    {
                        Formatting = Formatting.Indented,
                        Indentation = 4,
                        IndentChar = ' '
                    };
                    serializer.Serialize(jsonWriter, obj);
                    return textWriter.ToString();
                }
                else
                {
                    return str;
                }
            }
    
    
    展开全文
  • json数据压缩

    千次阅读 2020-07-24 15:40:18
    默认的json数据是带有换行的,所以最简单的压缩方法是将json中的回车换行去掉,压缩成一行字符串。 测试:找了一个大的json字符串,原始大小为1.1m,去掉回车换行压缩成一行后,大小变为了360k。 在线压缩工具:...
  • emoji表情本地JSON文件

    2020-06-05 21:51:17
    可用于前端展示的emoji表情库,整合了常用的167个表情,无乱码,带有表情名称、分类标签以及对应的utf-16编码。新增了压缩版,压缩版中无分类标签和表情名称,共有4022个emoji表情。
  • // 输出图片地址(必选,同时也会自动生成同名 json 文件,如:sprite.json) path.join(__dirname, "resource/sprite.png"), // 输出的 json 文件中的基本目录,即:地址前缀(可选参数) "/my-image", // ...
  • Json压缩格式化

    千次阅读 2018-10-17 14:42:02
    Json在线压缩格式化工具 Json压缩格式化HTML压缩格式化,CSS压缩格式化,Javascript压缩格式化,XML压缩格式化,SQL压缩格式化  
  • C++对json文件的操作

    2017-08-01 18:20:13
    压缩文件解压至工程目录下 在项目中增加#include"json/json.h" 即可使用
  • .net core获取读取json配置文件示例源码,控制台程序。
  • nginx 压缩json

    2021-03-19 11:20:54
    Nginx配置文件配置 在server节点下新增如下内容,开启gzip压缩。注意后端需要保证返回的 Content-Type: application/json;charset=UTF-8 gzip on; gzip_min_length 1k; gzip_comp_level 6; gzip_proxied expired ...
  • 将Python列表内容写入JSON文件并存储的两种方法,压缩内包含一个python文件与json文件
  • 因为我使用的是jackson来进行json解析的,所以使用注解@JsonProperty来表示一下修改的json文件对应原来的java bean里面的属性,这样解析的时候就不会出错了。 2.4 常规总结 经过上面的常规操作, 我们的json...
  • echart china.json,包含压缩版china.json和未压缩版的china.json(不乱码,可自行编辑,有九线段和不含九线段版本),和中国各省市json文件
  • JSON常见几种压缩方式

    万次阅读 2020-03-06 15:40:29
    无论使用何种编程语言,json格式的数据已被广泛应用,不论是数据的传输还是存储,在很多应用场景下,你可能想进一步地压缩JSON字符串的长度,以提升传输效率,如果你使用的是nosql数据库,你可能想进一步的压缩json...
  • 在日常的web前端开发过程中,将骨骼动画中、或者其他大的json文件去掉空格、换行,压缩,是每次发布过程中必须的操作
  • Java生成Json文件添加到ZIP压缩并导出前言代码说明小结 前言      需要根据在前端选择的文件列表生产Json文件并导出Zip文件 代码说明      前端部分的方法: //...
  • json2txt “解压缩”的文件json 伴奏自动配置automake --add-missing 。/配置使进行安装 您可以“制作”新的安装程序。
  • ECharts全国及各个省地图js、json文件 全省js、json文件可用亲测
  • 压缩JSON,压缩Perfab

    2019-10-31 14:52:55
    删除文件中的回车与空格,减少存储。如:JSON,Perfab等 Compact.exe -- help - dest string --dest=/path(default "./config") -suffix string --suffix=json,perfab(default "json,perfab")
  • 如何压缩JSON

    2016-08-31 07:11:44
    <p>I have a webservice sending a huge JSON text to an Android app. There's about 20000 ID numbers. Unfortunately but perhaps not surprisingly it's timing out. <p>What options do I have? The easiest ...
  • json 压缩和格式化工具

    千次阅读 2018-10-12 19:20:22
    C/C++层JSON库在www.json.org有。 我使用jsmn。 https://github.com/DeYangLiu/jsmn/commit/2d979edea9b628a44f9cc63fd3ef81a7446f84f5
  • 只需移动 zip 文件并将其解压缩到您想要安装的任何位置即可。 确保在cas-json-tool-0.4.0/bin目录到您的$PATH install 命令会创建一个新目录 (cas-json-tool-0.4.0),其中包含所有必需的 jar 文件和一些 shell/...
  • manifest.json的文件 3、打开这个 manifest.json文件,可以理解为配置文件 :slightly_smiling_face: 包含以下内容 代码如下: { “name”: “My First Extension”,//扩展的名字 “version”: “1.0”, //版本 ...
  • webpack (js&json&css的打包)

    千次阅读 2019-01-20 15:29:04
    webpack只能打包js和json文件 什么是webpack ? Webpack是一个模块打包器(bundler)。 在Webpack看来, 前端的所有资源文件(js/json/css/img/…)都会作为模块处理 它将根据模块的依赖关系进行静态分析,...
  • 压缩json大小还是改造项目那? 通过查阅资料,发现nginx提供gzip压缩,通过压缩可以减少json的大小 我们看一下效果如下: 1、大小又接近500KB降低到25.2KB 2、请求时长又1.7-2S之间降低到166MS左右 具体配置...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 108,147
精华内容 43,258
关键字:

压缩json文件