使用commons-lang3.jar来输出toString时,jar版本 3.8,3.9,3.10输出中文被unicode编码了
查询源码对比下发现下面方法有区别
org.apache.commons.lang3.builder.ToStringStyle.appendValueAsString()
3.7版本
/**
* Appends the given String in parenthesis to the given StringBuffer.
*
* @param buffer the StringBuffer to append the value to.
* @param value the value to append.
*/
private void appendValueAsString(final StringBuffer buffer, final String value) {
buffer.append('"').append(value).append('"');
}
3.10版本
/**
* Appends the given String enclosed in double-quotes to the given StringBuffer.
*
* @param buffer the StringBuffer to append the value to.
* @param value the value to append.
*/
private void appendValueAsString(final StringBuffer buffer, final String value) {
buffer.append('"').append(StringEscapeUtils.escapeJson(value)).append('"');
}
3.10中的appendValueAsString()在拼接时对value进行了特殊处理,调用了下面函数
org.apache.commons.lang3.StringEscapeUtils.escapeJson()
org.apache.commons.lang3.text.translate.UnicodeEscaper.translate()
可以通过继承ToStringStyle,重写appendValueAsString()方法来修改
package com.example.test;
import org.apache.commons.lang3.StringEscapeUtils;
import org.apache.commons.lang3.builder.ToStringStyle;
public class JsonTest extends ToStringStyle
{
public static final ToStringStyle JSON_STYLE_C = new JsonStringStyle();
private static final class JsonStringStyle extends ToStringStyle {
private static final long serialVersionUID = 1L;
private static final String FIELD_NAME_QUOTE = "\"";
/**
* <p>
* Constructor.
* </p>
*
* <p>
* Use the static constant rather than instantiating.
* </p>
*/
JsonStringStyle() {
super();
this.setUseClassName(false);
this.setUseIdentityHashCode(false);
this.setContentStart("{");
this.setContentEnd("}");
this.setArrayStart("[");
this.setArrayEnd("]");
this.setFieldSeparator(",");
this.setFieldNameValueSeparator(":");
this.setNullText("null");
this.setSummaryObjectStartText("\"<");
this.setSummaryObjectEndText(">\"");
this.setSizeStartText("\"<size=");
this.setSizeEndText(">\"");
}
@Override
public void append(final StringBuffer buffer, final String fieldName,
final Object[] array, final Boolean fullDetail) {
if (fieldName == null) {
throw new UnsupportedOperationException(
"Field names are mandatory when using JsonToStringStyle");
}
if (!isFullDetail(fullDetail)) {
throw new UnsupportedOperationException(
"FullDetail must be true when using JsonToStringStyle");
}
super.append(buffer, fieldName, array, fullDetail);
}
@Override
public void append(final StringBuffer buffer, final String fieldName, final long[] array,
final Boolean fullDetail) {
if (fieldName == null) {
throw new UnsupportedOperationException(
"Field names are mandatory when using JsonToStringStyle");
}
if (!isFullDetail(fullDetail)) {
throw new UnsupportedOperationException(
"FullDetail must be true when using JsonToStringStyle");
}
super.append(buffer, fieldName, array, fullDetail);
}
@Override
public void append(final StringBuffer buffer, final String fieldName, final int[] array,
final Boolean fullDetail) {
if (fieldName == null) {
throw new UnsupportedOperationException(
"Field names are mandatory when using JsonToStringStyle");
}
if (!isFullDetail(fullDetail)) {
throw new UnsupportedOperationException(
"FullDetail must be true when using JsonToStringStyle");
}
super.append(buffer, fieldName, array, fullDetail);
}
@Override
public void append(final StringBuffer buffer, final String fieldName,
final short[] array, final Boolean fullDetail) {
if (fieldName == null) {
throw new UnsupportedOperationException(
"Field names are mandatory when using JsonToStringStyle");
}
if (!isFullDetail(fullDetail)) {
throw new UnsupportedOperationException(
"FullDetail must be true when using JsonToStringStyle");
}
super.append(buffer, fieldName, array, fullDetail);
}
@Override
public void append(final StringBuffer buffer, final String fieldName, final byte[] array,
final Boolean fullDetail) {
if (fieldName == null) {
throw new UnsupportedOperationException(
"Field names are mandatory when using JsonToStringStyle");
}
if (!isFullDetail(fullDetail)) {
throw new UnsupportedOperationException(
"FullDetail must be true when using JsonToStringStyle");
}
super.append(buffer, fieldName, array, fullDetail);
}
@Override
public void append(final StringBuffer buffer, final String fieldName, final char[] array,
final Boolean fullDetail) {
if (fieldName == null) {
throw new UnsupportedOperationException(
"Field names are mandatory when using JsonToStringStyle");
}
if (!isFullDetail(fullDetail)) {
throw new UnsupportedOperationException(
"FullDetail must be true when using JsonToStringStyle");
}
super.append(buffer, fieldName, array, fullDetail);
}
@Override
public void append(final StringBuffer buffer, final String fieldName,
final double[] array, final Boolean fullDetail) {
if (fieldName == null) {
throw new UnsupportedOperationException(
"Field names are mandatory when using JsonToStringStyle");
}
if (!isFullDetail(fullDetail)) {
throw new UnsupportedOperationException(
"FullDetail must be true when using JsonToStringStyle");
}
super.append(buffer, fieldName, array, fullDetail);
}
@Override
public void append(final StringBuffer buffer, final String fieldName,
final float[] array, final Boolean fullDetail) {
if (fieldName == null) {
throw new UnsupportedOperationException(
"Field names are mandatory when using JsonToStringStyle");
}
if (!isFullDetail(fullDetail)) {
throw new UnsupportedOperationException(
"FullDetail must be true when using JsonToStringStyle");
}
super.append(buffer, fieldName, array, fullDetail);
}
@Override
public void append(final StringBuffer buffer, final String fieldName,
final boolean[] array, final Boolean fullDetail) {
if (fieldName == null) {
throw new UnsupportedOperationException(
"Field names are mandatory when using JsonToStringStyle");
}
if (!isFullDetail(fullDetail)) {
throw new UnsupportedOperationException(
"FullDetail must be true when using JsonToStringStyle");
}
super.append(buffer, fieldName, array, fullDetail);
}
@Override
public void append(final StringBuffer buffer, final String fieldName, final Object value,
final Boolean fullDetail) {
if (fieldName == null) {
throw new UnsupportedOperationException(
"Field names are mandatory when using JsonToStringStyle");
}
if (!isFullDetail(fullDetail)) {
throw new UnsupportedOperationException(
"FullDetail must be true when using JsonToStringStyle");
}
super.append(buffer, fieldName, value, fullDetail);
}
@Override
protected void appendDetail(final StringBuffer buffer, final String fieldName, final char value) {
appendValueAsString(buffer, String.valueOf(value));
}
@Override
protected void appendDetail(final StringBuffer buffer, final String fieldName, final Object value) {
if (value == null) {
appendNullText(buffer, fieldName);
return;
}
if (value instanceof String || value instanceof Character) {
appendValueAsString(buffer, value.toString());
return;
}
if (value instanceof Number || value instanceof Boolean) {
buffer.append(value);
return;
}
final String valueAsString = value.toString();
if (isJsonObject(valueAsString) || isJsonArray(valueAsString)) {
buffer.append(value);
return;
}
appendDetail(buffer, fieldName, valueAsString);
}
private boolean isJsonArray(final String valueAsString) {
return valueAsString.startsWith(getArrayStart())
&& valueAsString.endsWith(getArrayEnd());
}
private boolean isJsonObject(final String valueAsString) {
return valueAsString.startsWith(getContentStart())
&& valueAsString.endsWith(getContentEnd());
}
/**
* Appends the given String enclosed in double-quotes to the given StringBuffer.
*
* @param buffer the StringBuffer to append the value to.
* @param value the value to append.
*/
private void appendValueAsString(final StringBuffer buffer, final String value) {
buffer.append('"').append(value).append('"');
}
@Override
protected void appendFieldStart(final StringBuffer buffer, final String fieldName) {
if (fieldName == null) {
throw new UnsupportedOperationException(
"Field names are mandatory when using JsonToStringStyle");
}
super.appendFieldStart(buffer, FIELD_NAME_QUOTE + StringEscapeUtils.escapeJson(fieldName)
+ FIELD_NAME_QUOTE);
}
/**
* <p>
* Ensure {@code Singleton} after serialization.
* </p>
*
* @return the singleton
*/
private Object readResolve() {
return JSON_STYLE;
}
}
}
调用的时候
@Override
public String toString()
{
return ToStringBuilder.reflectionToString(this, JsonTest.JSON_STYLE_C);
}
输出结果
{"age":"666","name":"张三丰"}
===============================解法2======================================
@Override
public String toString() {
return StringEscapeUtils.unescapeJson(ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE));
}
将StringEscapeUtils.escapeJson(value)后的字符串再逆向操作(unescapeJson)即可。