Merge branch 'branch-3.4-fix-json-style-rebase'
LANG-1128: JsonToStringStyle doesn't handle chars and objects correctly. This also fixes #74 from github. Thanks to github user jacktan1991.
This commit is contained in:
commit
4a882e76d9
|
@ -22,6 +22,7 @@
|
|||
<body>
|
||||
|
||||
<release version="3.5" date="tba" description="tba">
|
||||
<action issue="LANG-1128" type="fix" dev="britter" due-to="jacktan1991">JsonToStringStyle doesn't handle chars and objects correctly</action>
|
||||
<action issue="LANG-456" type="fix" dev="britter" due-to="Bob Fields, Woosan Ko, Bruno P. Kinoshita">HashCodeBuilder throws StackOverflowError in bidirectional navigable association</action>
|
||||
<action issue="LANG-1126" type="fix" dev="britter">DateFormatUtilsTest.testSMTP depends on the default Locale</action>
|
||||
<action issue="LANG-1123" type="fix" dev="chas" due-to="Christian P. Momon">Unit test FastDatePrinterTimeZonesTest needs a timezone set</action>
|
||||
|
|
|
@ -2559,22 +2559,46 @@ public void append(StringBuffer buffer, String fieldName, Object value,
|
|||
super.append(buffer, fieldName, value, fullDetail);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void appendDetail(StringBuffer buffer, String fieldName, char value) {
|
||||
appendValueAsString(buffer, String.valueOf(value));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void appendDetail(StringBuffer buffer, String fieldName, Object value) {
|
||||
|
||||
if (value == null) {
|
||||
|
||||
appendNullText(buffer, fieldName);
|
||||
return;
|
||||
}
|
||||
|
||||
if (value.getClass() == String.class) {
|
||||
|
||||
appendValueAsString(buffer, (String)value);
|
||||
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(String valueAsString) {
|
||||
return valueAsString.startsWith(getArrayStart())
|
||||
&& valueAsString.startsWith(getArrayEnd());
|
||||
}
|
||||
|
||||
private boolean isJsonObject(String valueAsString) {
|
||||
return valueAsString.startsWith(getContentStart())
|
||||
&& valueAsString.endsWith(getContentEnd());
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
import static org.junit.Assert.fail;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
|
||||
import org.apache.commons.lang3.SystemUtils;
|
||||
|
@ -91,6 +92,37 @@ public void testAppendSuper() {
|
|||
.appendSuper("{\"a\":\"hello\"}").append("b", "world").toString());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testChar() {
|
||||
try {
|
||||
new ToStringBuilder(base).append('A').toString();
|
||||
fail("Should have generated UnsupportedOperationException");
|
||||
} catch (UnsupportedOperationException e) {
|
||||
}
|
||||
|
||||
assertEquals("{\"a\":\"A\"}", new ToStringBuilder(base).append("a", 'A')
|
||||
.toString());
|
||||
assertEquals("{\"a\":\"A\",\"b\":\"B\"}", new ToStringBuilder(base).append("a", 'A').append("b", 'B')
|
||||
.toString());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDate() {
|
||||
final Date now = new Date();
|
||||
final Date afterNow = new Date(System.currentTimeMillis() + 1);
|
||||
|
||||
try {
|
||||
new ToStringBuilder(base).append(now).toString();
|
||||
fail("Should have generated UnsupportedOperationException");
|
||||
} catch (UnsupportedOperationException e) {
|
||||
}
|
||||
|
||||
assertEquals("{\"now\":\"" + now.toString() +"\"}", new ToStringBuilder(base).append("now", now)
|
||||
.toString());
|
||||
assertEquals("{\"now\":\"" + now.toString() +"\",\"after\":\"" + afterNow.toString() + "\"}", new ToStringBuilder(base).append("now", now).append("after", afterNow)
|
||||
.toString());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testObject() {
|
||||
|
||||
|
@ -196,6 +228,30 @@ public void testPerson() {
|
|||
.toString());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testNestingPerson() {
|
||||
final Person p = new Person(){
|
||||
public String toString(){
|
||||
return new ToStringBuilder(this).append("name", this.name)
|
||||
.append("age", this.age).append("smoker", this.smoker)
|
||||
.toString();
|
||||
}
|
||||
};
|
||||
p.name = "Jane Doe";
|
||||
p.age = 25;
|
||||
p.smoker = true;
|
||||
|
||||
final NestingPerson nestP = new NestingPerson();
|
||||
nestP.pid="#1@Jane";
|
||||
nestP.person = p;
|
||||
|
||||
assertEquals(
|
||||
"{\"pid\":\"#1@Jane\",\"person\":{\"name\":\"Jane Doe\",\"age\":25,\"smoker\":true}}",
|
||||
new ToStringBuilder(nestP).append("pid", nestP.pid)
|
||||
.append("person", nestP.person)
|
||||
.toString());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testLong() {
|
||||
|
||||
|
@ -303,4 +359,20 @@ public void testLongArrayArray() {
|
|||
} catch (UnsupportedOperationException e) {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* An object with nested object structures used to test {@link JsonToStringStyle}.
|
||||
*
|
||||
*/
|
||||
static class NestingPerson {
|
||||
/**
|
||||
* Test String field.
|
||||
*/
|
||||
String pid;
|
||||
|
||||
/**
|
||||
* Test nested object field.
|
||||
*/
|
||||
Person person;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue