一般的json文件拥有很多的空格和注释,虽然读起来比较方便,但是在运行的时候是要占一些内存的。
于是json压缩工具就应运而生了,这个工具是用java做的,原理是:
1:在Eclipse中导出一个可运行的jar文件
2:用python运行这个jar文件,并向这个jar文件的运行程序传一些main方法的参数(一般只传路径就可以了)
//bat文件的代码如下:set assetsAPath="..\javaOutput\assets\uijson" ???原json文件路径set assetsBPath="..\javaOutput\assets\uijson\\" 压缩后的json文件路径set targetJar="JSONMinify.jar" cd ./langjava -jar lib/JSONMinify.jarcd ..cd ./toolsjava -jar %targetJar% resVersion=%resVersion% ?assetsAPath=%assetsAPath% assetsBPath=%assetsBPath% pause
//java代码如下package com.pack;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.File;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;import java.util.ArrayList;import java.util.List;import com.zhaohe.download.ResourceDownloader;public class JSONMinify {static ArrayList<String> fileName;public static void main(String[] args) throws Exception {initArgs(args);String fileData1 = assetsAPath;String fileDatas2 = assetsBPath;fileName = new ArrayList<String>();File folder = new File(fileDatas2);List<String> filesPath = getAllFile(fileData1, false);System.err.println(getAllFile(fileData1, false).size());System.err.println(fileData1);for (int i = 0; i < getAllFile(fileData1, false).size(); i++) {System.err.println(filesPath.get(i));File file = new File(filesPath.get(i));// 需要读取的文件File file1 = new File(fileDatas2, fileName.get(i));// 需要写进去的文件String fileContext = txt2String(file);// 文件内容file.delete();if (!file1.exists()) {file.createNewFile();}BufferedWriter out = new BufferedWriter(new FileWriter(fileDatas2 + fileName.get(i)));out.write(minify(fileContext));out.close();}}private static final String manifestFileName = "assetsManifest.txt";private static final String remoteVersionFile = "assetsVersion.txt";private static final String lcoalVersionFile = "localAssetsVersion.txt";private static String version = "1.0.2";private static String assetsAPath = "..\\android\\assets\\uiname\\";private static String assetsBPath = "..\\android\\assets\\uijson\\";private static String rootFolder = ".\\packages";private static String cdnUrl = "http://www.mathmt.com";private static String serverID = "12";private static String resVersion = String.valueOf(ResourceDownloader.RES_TYPE_CURRENT);public static void initArgs(String args[]) {if (args != null) {for (String arg : args) {String[] keyValue = arg.split("=");final String key = keyValue[0];final String value = keyValue[1];if ("targetVersion".equals(key)) {version = value;} else if ("assetsAPath".equals(key)) {assetsAPath = value;} else if ("assetsBPath".equals(key)) {assetsBPath = value;} else if ("cdnUrl".equals(key)) {cdnUrl = value;} else if ("rootFolder".equals(key)) {rootFolder = value;} else if ("serverID".equals(key)) {serverID = value;} else if ("resVersion".equals(key)) {resVersion = value;} else {System.out.println("Unknown key:" + key);}}}}public static boolean deleteDir(String path) {File file = new File(path);if (!file.exists()) {// 判断是否待删除目录是否存在return false;}String[] content = file.list();// 取得当前目录下所有文件和文件夹for (String name : content) {File temp = new File(path, name);if (temp.isDirectory()) {// 判断是否是目录deleteDir(temp.getAbsolutePath());// 递归调用,删除目录里的内容temp.delete();// 删除空目录} else {if (!temp.delete()) {// 直接删除文件temp.delete();System.err.println("Failed to delete " + name);}}}return true;}/* * 读取txt文件的内容 * ?* @param file 想要读取的文件对象 * ?* @return 返回文件内容 */public static String txt2String(File file) {StringBuilder result = new StringBuilder();try {BufferedReader br = new BufferedReader(new FileReader(file));// 构造一个BufferedReader类来读取文件String s = null;while ((s = br.readLine()) != null) {// 使用readLine方法,一次读一行result.append(System.lineSeparator() + s);}br.close();} catch (Exception e) {e.printStackTrace();}return result.toString();}/** * 以行为单位读取文件,常用于读面向行的格式化文件 */public static void readFileByLines(String fileName) {File file = new File(fileName);BufferedReader reader = null;try {System.out.println("以行为单位读取文件内容,一次读一整行:");reader = new BufferedReader(new FileReader(file));String tempString = null;int line = 1;// 一次读入一行,直到读入null为文件结束while ((tempString = reader.readLine()) != null) {// 显示行号System.out.println("line " + line + ": " + tempString);line++;}reader.close();} catch (IOException e) {e.printStackTrace();} finally {if (reader != null) {try {reader.close();} catch (IOException e1) {}}}}/** * 获取路径下的所有文件/文件夹 * ?* @param directoryPath * ???????????需要遍历的文件夹路径 * @param isAddDirectory * ???????????是否将子文件夹的路径也添加到list集合中 * @return */public static List<String> getAllFile(String directoryPath, boolean isAddDirectory) {List<String> list = new ArrayList<String>();File baseFile = new File(directoryPath);if (baseFile.isFile() || !baseFile.exists()) {return list;}File[] files = baseFile.listFiles();for (File file : files) {if (file.isDirectory()) {if (isAddDirectory) {list.add(file.getAbsolutePath());}list.addAll(getAllFile(file.getAbsolutePath(), isAddDirectory));} else {list.add(file.getAbsolutePath());fileName.add(file.getName());}}return list;}public static String minify(String jsonString) {boolean in_string = false;boolean in_multiline_comment = false;boolean in_singleline_comment = false;char string_opener = ‘x‘;StringBuilder out = new StringBuilder();for (int i = 0; i < jsonString.length(); i++) {char c = jsonString.charAt(i);String cc = jsonString.substring(i, Math.min(i + 2, jsonString.length()));if (in_string) {if (c == string_opener) {in_string = false;out.append(c);} else if (c == ‘\\‘) {out.append(cc);++i;} elseout.append(c);} else if (in_singleline_comment) {if (c == ‘\r‘ || c == ‘\n‘)in_singleline_comment = false;} else if (in_multiline_comment) {if (cc.equals("*/")) {in_multiline_comment = false;++i;}} else {if (cc.equals("/*")) {in_multiline_comment = true;++i;} else if (cc.equals("//")) {in_singleline_comment = true;++i;} else if (c == ‘"‘ || c == ‘\‘‘) {in_string = true;string_opener = c;out.append(c);} else if (!Character.isWhitespace(c))out.append(c);}}return out.toString();}}
Json压缩工具
原文地址:https://www.cnblogs.com/xingyunge/p/9426441.html