Title: [1965] trunk: Ill-formed JSON generated, because JSON writer is fed with type of declaring field instead of the real object's type (XSTR-696).

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:

http://xircles.codehaus.org/manage_email

Reply via email to