一、前言
关于google-gson源码包中com.google.gson.Escaper加密转码处理类,可以对json数据类型进行加密转码处理escapeJsonString操作,详情参见源码说明。
二、源码说明
package com.google.gson;@b@@b@import java.io.IOException;@b@import java.util.Collections;@b@import java.util.HashSet;@b@import java.util.Set;@b@@b@final class Escaper@b@{@b@ private static final char[] HEX_CHARS = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };@b@ private static final Set<Character> JS_ESCAPE_CHARS;@b@ private static final Set<Character> HTML_ESCAPE_CHARS;@b@ private final boolean escapeHtmlCharacters;@b@@b@ Escaper(boolean escapeHtmlCharacters)@b@ {@b@ this.escapeHtmlCharacters = escapeHtmlCharacters;@b@ }@b@@b@ public String escapeJsonString(CharSequence plainText) {@b@ StringBuilder escapedString = new StringBuilder(plainText.length() + 20);@b@ try {@b@ escapeJsonString(plainText, escapedString);@b@ } catch (IOException e) {@b@ throw new RuntimeException(e);@b@ }@b@ return escapedString.toString();@b@ }@b@@b@ private void escapeJsonString(CharSequence plainText, StringBuilder out) throws IOException {@b@ int pos = 0;@b@ int len = plainText.length();@b@@b@ for (int i = 0; i < len; i += charCount) {@b@ int codePoint = Character.codePointAt(plainText, i);@b@ int charCount = Character.charCount(codePoint);@b@@b@ if ((!(isControlCharacter(codePoint))) && (!(mustEscapeCharInJsString(codePoint)))) {@b@ break label234:@b@ }@b@@b@ out.append(plainText, pos, i);@b@ pos = i + charCount;@b@ switch (codePoint)@b@ {@b@ case 8:@b@ out.append("\\b");@b@ break;@b@ case 9:@b@ out.append("\\t");@b@ break;@b@ case 10:@b@ out.append("\\n");@b@ break;@b@ case 12:@b@ out.append("\\f");@b@ break;@b@ case 13:@b@ out.append("\\r");@b@ break;@b@ case 92:@b@ out.append("\\\\");@b@ break;@b@ case 47:@b@ out.append("\\/");@b@ break;@b@ case 34:@b@ out.append("\\\"");@b@ break;@b@ default:@b@ appendHexJavaScriptRepresentation(codePoint, out);@b@ }@b@ }@b@@b@ label234: out.append(plainText, pos, len);@b@ }@b@@b@ private boolean mustEscapeCharInJsString(int codepoint) {@b@ if (!(Character.isSupplementaryCodePoint(codepoint))) {@b@ char c = (char)codepoint;@b@ return ((JS_ESCAPE_CHARS.contains(Character.valueOf(c))) || ((this.escapeHtmlCharacters) && (HTML_ESCAPE_CHARS.contains(Character.valueOf(c)))));@b@ }@b@@b@ return false;@b@ }@b@@b@ private static boolean isControlCharacter(int codePoint)@b@ {@b@ return ((codePoint < 32) || (codePoint == 8232) || (codePoint == 8233) || ((codePoint >= 127) && (codePoint <= 159)));@b@ }@b@@b@ private static void appendHexJavaScriptRepresentation(int codePoint, Appendable out)@b@ throws IOException@b@ {@b@ if (Character.isSupplementaryCodePoint(codePoint))@b@ {@b@ char[] surrogates = Character.toChars(codePoint);@b@ appendHexJavaScriptRepresentation(surrogates[0], out);@b@ appendHexJavaScriptRepresentation(surrogates[1], out);@b@ return;@b@ }@b@ out.append("\\u").append(HEX_CHARS[(codePoint >>> 12 & 0xF)]).append(HEX_CHARS[(codePoint >>> 8 & 0xF)]).append(HEX_CHARS[(codePoint >>> 4 & 0xF)]).append(HEX_CHARS[(codePoint & 0xF)]);@b@ }@b@@b@ static@b@ {@b@ Set mandatoryEscapeSet = new HashSet();@b@ mandatoryEscapeSet.add(Character.valueOf('"'));@b@ mandatoryEscapeSet.add(Character.valueOf('\\'));@b@ JS_ESCAPE_CHARS = Collections.unmodifiableSet(mandatoryEscapeSet);@b@@b@ Set htmlEscapeSet = new HashSet();@b@ htmlEscapeSet.add(Character.valueOf('<'));@b@ htmlEscapeSet.add(Character.valueOf('>'));@b@ htmlEscapeSet.add(Character.valueOf('&'));@b@ htmlEscapeSet.add(Character.valueOf('='));@b@ htmlEscapeSet.add(Character.valueOf('\''));@b@@b@ HTML_ESCAPE_CHARS = Collections.unmodifiableSet(htmlEscapeSet);@b@ }@b@}