Log Message
Ill-formed JSON generated, because JSON writer is fed with type of declaring field instead of the real object's type (XSTR-696).
Modified Paths
- trunk/xstream/src/java/com/thoughtworks/xstream/converters/basic/NullConverter.java
- trunk/xstream/src/java/com/thoughtworks/xstream/converters/collections/MapConverter.java
- trunk/xstream/src/java/com/thoughtworks/xstream/converters/javabean/JavaBeanConverter.java
- trunk/xstream/src/java/com/thoughtworks/xstream/converters/reflection/AbstractReflectionConverter.java
- trunk/xstream/src/java/com/thoughtworks/xstream/converters/reflection/SerializableConverter.java
- trunk/xstream/src/test/com/thoughtworks/xstream/io/json/JsonHierarchicalStreamDriverTest.java
- trunk/xstream/src/test/com/thoughtworks/xstream/io/json/JsonWriterModeDroppingRootTest.java
- trunk/xstream-distribution/src/content/changes.html
Diff
Modified: trunk/xstream/src/java/com/thoughtworks/xstream/converters/basic/NullConverter.java (1964 => 1965)
--- trunk/xstream/src/java/com/thoughtworks/xstream/converters/basic/NullConverter.java 2012-03-20 18:47:53 UTC (rev 1964)
+++ trunk/xstream/src/java/com/thoughtworks/xstream/converters/basic/NullConverter.java 2012-03-20 18:48:37 UTC (rev 1965)
@@ -1,6 +1,6 @@
/*
* Copyright (C) 2003, 2004 Joe Walnes.
- * Copyright (C) 2006, 2007 XStream Committers.
+ * Copyright (C) 2006, 2007, 2012 XStream Committers.
* All rights reserved.
*
* The software in this package is published under the terms of the BSD
@@ -31,7 +31,7 @@
}
public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {
- ExtendedHierarchicalStreamWriterHelper.startNode(writer, "null", null);
+ ExtendedHierarchicalStreamWriterHelper.startNode(writer, "null", Mapper.Null.class);
writer.endNode();
}
Modified: trunk/xstream/src/java/com/thoughtworks/xstream/converters/collections/MapConverter.java (1964 => 1965)
--- trunk/xstream/src/java/com/thoughtworks/xstream/converters/collections/MapConverter.java 2012-03-20 18:47:53 UTC (rev 1964)
+++ trunk/xstream/src/java/com/thoughtworks/xstream/converters/collections/MapConverter.java 2012-03-20 18:48:37 UTC (rev 1965)
@@ -1,6 +1,6 @@
/*
* Copyright (C) 2003, 2004, 2005 Joe Walnes.
- * Copyright (C) 2006, 2007, 2008, 2010, 2011 XStream Committers.
+ * Copyright (C) 2006, 2007, 2008, 2010, 2011, 2012 XStream Committers.
* All rights reserved.
*
* The software in this package is published under the terms of the BSD
@@ -52,7 +52,7 @@
Map map = (Map) source;
for (Iterator iterator = map.entrySet().iterator(); iterator.hasNext();) {
Map.Entry entry = (Map.Entry) iterator.next();
- ExtendedHierarchicalStreamWriterHelper.startNode(writer, mapper().serializedClass(Map.Entry.class), Map.Entry.class);
+ ExtendedHierarchicalStreamWriterHelper.startNode(writer, mapper().serializedClass(Map.Entry.class), entry.getClass());
writeItem(entry.getKey(), context, writer);
writeItem(entry.getValue(), context, writer);
Modified: trunk/xstream/src/java/com/thoughtworks/xstream/converters/javabean/JavaBeanConverter.java (1964 => 1965)
--- trunk/xstream/src/java/com/thoughtworks/xstream/converters/javabean/JavaBeanConverter.java 2012-03-20 18:47:53 UTC (rev 1964)
+++ trunk/xstream/src/java/com/thoughtworks/xstream/converters/javabean/JavaBeanConverter.java 2012-03-20 18:48:37 UTC (rev 1965)
@@ -1,6 +1,6 @@
/*
* Copyright (C) 2005 Joe Walnes.
- * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 XStream Committers.
+ * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012 XStream Committers.
* All rights reserved.
*
* The software in this package is published under the terms of the BSD
@@ -84,10 +84,10 @@
}
private void writeField(String propertyName, Class fieldType, Object newObj, Class definedIn) {
- String serializedMember = mapper.serializedMember(source.getClass(), propertyName);
- ExtendedHierarchicalStreamWriterHelper.startNode(writer, serializedMember, fieldType);
Class actualType = newObj.getClass();
Class defaultType = mapper.defaultImplementationOf(fieldType);
+ String serializedMember = mapper.serializedMember(source.getClass(), propertyName);
+ ExtendedHierarchicalStreamWriterHelper.startNode(writer, serializedMember, actualType);
if (!actualType.equals(defaultType) && classAttributeName != null) {
writer.addAttribute(classAttributeName, mapper.serializedClass(actualType));
}
Modified: trunk/xstream/src/java/com/thoughtworks/xstream/converters/reflection/AbstractReflectionConverter.java (1964 => 1965)
--- trunk/xstream/src/java/com/thoughtworks/xstream/converters/reflection/AbstractReflectionConverter.java 2012-03-20 18:47:53 UTC (rev 1964)
+++ trunk/xstream/src/java/com/thoughtworks/xstream/converters/reflection/AbstractReflectionConverter.java 2012-03-20 18:48:37 UTC (rev 1965)
@@ -152,7 +152,7 @@
? mapping.getItemFieldName()
: mapper.serializedClass(Map.Entry.class);
Map.Entry entry = (Map.Entry) obj;
- ExtendedHierarchicalStreamWriterHelper.startNode(writer, entryName, Map.Entry.class);
+ ExtendedHierarchicalStreamWriterHelper.startNode(writer, entryName, entry.getClass());
writeItem(entry.getKey(), context, writer);
writeItem(entry.getValue(), context, writer);
writer.endNode();
@@ -178,12 +178,12 @@
void writeField(String fieldName, String aliasName, Class fieldType,
Class definedIn, Object newObj) {
+ Class actualType = newObj != null ? newObj.getClass() : fieldType;
ExtendedHierarchicalStreamWriterHelper.startNode(writer, aliasName != null
? aliasName
- : mapper.serializedMember(source.getClass(), fieldName), fieldType);
+ : mapper.serializedMember(source.getClass(), fieldName), actualType);
if (newObj != null) {
- Class actualType = newObj.getClass();
Class defaultType = mapper.defaultImplementationOf(fieldType);
if (!actualType.equals(defaultType)) {
String serializedClassName = mapper.serializedClass(actualType);
Modified: trunk/xstream/src/java/com/thoughtworks/xstream/converters/reflection/SerializableConverter.java (1964 => 1965)
--- trunk/xstream/src/java/com/thoughtworks/xstream/converters/reflection/SerializableConverter.java 2012-03-20 18:47:53 UTC (rev 1964)
+++ trunk/xstream/src/java/com/thoughtworks/xstream/converters/reflection/SerializableConverter.java 2012-03-20 18:48:37 UTC (rev 1965)
@@ -131,7 +131,9 @@
+ " may not write a field named '" + name + "'");
}
if (value != null) {
- ExtendedHierarchicalStreamWriterHelper.startNode(writer, mapper.serializedMember(source.getClass(), name), field.getType());
+ ExtendedHierarchicalStreamWriterHelper.startNode(
+ writer, mapper.serializedMember(source.getClass(), name),
+ value.getClass());
if (field.getType() != value.getClass() && !field.getType().isPrimitive()) {
String attributeName = mapper.aliasForSystemAttribute(ATTRIBUTE_CLASS);
if (attributeName != null) {
@@ -171,9 +173,9 @@
continue;
}
- ExtendedHierarchicalStreamWriterHelper.startNode(writer, mapper.serializedMember(source.getClass(), field.getName()), field.getType());
-
Class actualType = value.getClass();
+ ExtendedHierarchicalStreamWriterHelper.startNode(
+ writer, mapper.serializedMember(source.getClass(), field.getName()), actualType);
Class defaultType = mapper.defaultImplementationOf(field.getType());
if (!actualType.equals(defaultType)) {
String attributeName = mapper.aliasForSystemAttribute(ATTRIBUTE_CLASS);
Modified: trunk/xstream/src/test/com/thoughtworks/xstream/io/json/JsonHierarchicalStreamDriverTest.java (1964 => 1965)
--- trunk/xstream/src/test/com/thoughtworks/xstream/io/json/JsonHierarchicalStreamDriverTest.java 2012-03-20 18:47:53 UTC (rev 1964)
+++ trunk/xstream/src/test/com/thoughtworks/xstream/io/json/JsonHierarchicalStreamDriverTest.java 2012-03-20 18:48:37 UTC (rev 1965)
@@ -1,6 +1,6 @@
/*
* Copyright (C) 2006 Joe Walnes.
- * Copyright (C) 2006, 2007, 2008, 2009, 2011 XStream Committers.
+ * Copyright (C) 2006, 2007, 2008, 2009, 2011, 2012 XStream Committers.
* All rights reserved.
*
* The software in this package is published under the terms of the BSD
@@ -645,7 +645,42 @@
assertEquals(expected, xstream.toXML(sa));
}
+
+ public void testRealTypeIsHonoredWhenWritingTheValue() {
+ xstream.alias("sa", SystemAttributes.class);
+ List list = new ArrayList();
+ list.add("joe");
+ list.add("mauro");
+ SystemAttributes[] sa = new SystemAttributes[2];
+ sa[0] = new SystemAttributes();
+ sa[0].name = "year";
+ sa[0].object = new Integer(2000);
+ sa[1] = new SystemAttributes();
+ sa[1].name = "names";
+ sa[1].object = list;
+
+ String expected = normalizeExpectation(""
+ + "{'sa-array': [\n"
+ + " {\n"
+ + " 'name': 'year',\n"
+ + " 'object': {\n"
+ + " '@class': 'int',\n"
+ + " '$': 2000\n"
+ + " }\n"
+ + " },\n"
+ + " {\n"
+ + " 'name': 'names',\n"
+ + " 'object': [\n"
+ + " 'joe',\n"
+ + " 'mauro'\n"
+ + " ]\n"
+ + " }\n"
+ + "]}");
+
+ assertEquals(expected, xstream.toXML(sa));
+ }
+
public void testCanMarshalExternalizable() {
xstream.alias("ext", SomethingExternalizable.class);
Modified: trunk/xstream/src/test/com/thoughtworks/xstream/io/json/JsonWriterModeDroppingRootTest.java (1964 => 1965)
--- trunk/xstream/src/test/com/thoughtworks/xstream/io/json/JsonWriterModeDroppingRootTest.java 2012-03-20 18:47:53 UTC (rev 1964)
+++ trunk/xstream/src/test/com/thoughtworks/xstream/io/json/JsonWriterModeDroppingRootTest.java 2012-03-20 18:48:37 UTC (rev 1965)
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2008, 2011 XStream Committers.
+ * Copyright (C) 2008, 2011, 2012 XStream Committers.
* All rights reserved.
*
* The software in this package is published under the terms of the BSD
@@ -17,6 +17,8 @@
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
import java.io.Writer;
+import java.util.ArrayList;
+import java.util.List;
/**
@@ -96,6 +98,38 @@
assertEquals(expected, xstream.toXML(sa));
}
+ public void testRealTypeIsHonoredWhenWritingTheValue() {
+ xstream.alias("sa", SystemAttributes.class);
+
+ List list = new ArrayList();
+ list.add("joe");
+ list.add("mauro");
+ SystemAttributes[] sa = new SystemAttributes[2];
+ sa[0] = new SystemAttributes();
+ sa[0].name = "year";
+ sa[0].object = new Integer(2000);
+ sa[1] = new SystemAttributes();
+ sa[1].name = "names";
+ sa[1].object = list;
+
+ String expected = normalizeExpectation(""
+ + "{'sa-array': [\n"
+ + " {\n"
+ + " 'name': 'year',\n"
+ + " 'object': 2000\n"
+ + " },\n"
+ + " {\n"
+ + " 'name': 'names',\n"
+ + " 'object': [\n"
+ + " 'joe',\n"
+ + " 'mauro'\n"
+ + " ]\n"
+ + " }\n"
+ + "]}");
+
+ assertEquals(expected, xstream.toXML(sa));
+ }
+
public void testStrictJSON() {
xstream = new XStream(new JsonHierarchicalStreamDriver() {
Modified: trunk/xstream-distribution/src/content/changes.html (1964 => 1965)
--- trunk/xstream-distribution/src/content/changes.html 2012-03-20 18:47:53 UTC (rev 1964)
+++ trunk/xstream-distribution/src/content/changes.html 2012-03-20 18:48:37 UTC (rev 1965)
@@ -43,6 +43,8 @@
<li>JIRA:XSTR-683: Inheritance of implicit collections, arrays or maps is dependent on declaration sequence.</li>
<li>Inherited implicit collections, arrays or maps can be overwritten with own definition in subtype.</li>
<li>JIRA:XSTR-688: Cannot omit XML elements from derived fields.</li>
+ <li>JIRA:XSTR-696: Ill-formed JSON generated, because JSON writer is fed with type of declaring field instead of
+ the real object's type.</li>
<li>JIRA:XSTR-685: Deserialization from file or URL keeps stream open.</li>
<li>JIRA:XSTR-684: XML 1.0 character validation fails for characters from 0x10 to 0x1f.</li>
<li>SerializableConverter is broken if the serialized type is the default implementation.</li>
To unsubscribe from this list please visit:
