Notice: This Wiki is now read only and edits are no longer possible. Please see: https://gitlab.eclipse.org/eclipsefdn/helpdesk/-/wikis/Wiki-shutdown-plan for the plan.
Difference between revisions of "EclipseLink/DesignDocs/459464"
m (→Overview) |
|||
Line 19: | Line 19: | ||
Special handling of JSON type property is deprecated. If there is need to identify type of JSON object - due to missing root element or some special inheritance requirements, it is necessary to specify fully qualified type property with http://www.w3.org/2001/XMLSchema-instance namespace. | Special handling of JSON type property is deprecated. If there is need to identify type of JSON object - due to missing root element or some special inheritance requirements, it is necessary to specify fully qualified type property with http://www.w3.org/2001/XMLSchema-instance namespace. | ||
− | Namespace prefix needs to be specified as JAXBContext property in | + | Namespace prefix needs to be specified as JAXBContext property in Marshaller or Unmarshaller: |
unmarshaller.setProperty(JAXBContextProperties.MEDIA_TYPE, MediaType.APPLICATION_JSON); | unmarshaller.setProperty(JAXBContextProperties.MEDIA_TYPE, MediaType.APPLICATION_JSON); | ||
Line 67: | Line 67: | ||
} | } | ||
} | } | ||
+ | |||
+ | == Backward Compatibility == | ||
To provide backward compatibility options, new system properties and JAXBContext/Marshaller/Unmarshaller properties are introduced: | To provide backward compatibility options, new system properties and JAXBContext/Marshaller/Unmarshaller properties are introduced: | ||
Line 73: | Line 75: | ||
org.eclipse.persistence.json.use-xsd-types-prefix | org.eclipse.persistence.json.use-xsd-types-prefix | ||
+ | |||
+ | When migrating from 2.5.x to 2.6, the simplest way is to set system property org.eclipse.persistence.json.type-compatibility to true. Alternatively there is option to set this property for Marshaller or Unmarshaller: | ||
+ | |||
+ | JAXBContext context = JAXBContext.newInstance(Foo.class); | ||
+ | |||
+ | Unmarshaller unmarshaller = context.createUnmarshaller(); | ||
+ | unmarshaller.setProperty(JAXBContextProperties.MEDIA_TYPE, MediaType.APPLICATION_JSON); | ||
+ | unmarshaller.setProperty(JAXBContextProperties.JSON_TYPE_COMPATIBILITY, true); | ||
+ | |||
+ | Marshaller marshaller = context.createMarshaller(); | ||
+ | marshaller.setProperty(JAXBContextProperties.MEDIA_TYPE, MediaType.APPLICATION_JSON); | ||
+ | marshaller.setProperty(JAXBContextProperties.JSON_TYPE_COMPATIBILITY, true); | ||
+ | |||
+ | To override default behavior for simple xsd types, set JAXBContextProperties.JSON_USE_XSD_TYPES_WITH_PREFIX property to true. |
Revision as of 16:53, 9 February 2015
Redesign of type property in JSON processing
Document History
Date | Author | Version Description & Notes |
---|---|---|
February 9th 2015 | Martin Vojtek | Initial revision |
Overview
Special handling of JSON type property is deprecated. If there is need to identify type of JSON object - due to missing root element or some special inheritance requirements, it is necessary to specify fully qualified type property with http://www.w3.org/2001/XMLSchema-instance namespace.
Namespace prefix needs to be specified as JAXBContext property in Marshaller or Unmarshaller:
unmarshaller.setProperty(JAXBContextProperties.MEDIA_TYPE, MediaType.APPLICATION_JSON); Map<String, String> namespaces = new HashMap<>(); namespaces.put(javax.xml.XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI, "xsi"); unmarshaller.setProperty(JAXBContextProperties.NAMESPACE_PREFIX_MAPPER, namespaces);
Json in MOXy 2.5.x:
{ "person": { "type": "developer", "name": "Martin Vojtek" } }
Json in MOXy 2.6.0:
{ "person": { "xsi.type": "developer", "name": "Martin Vojtek" } }
There is also change in default handling of simple xsd types when using namespaces. To specify simple xsd type as type value, there is no need to specify xsd prefix. Example:
Json in MOXy 2.5.x:
{ "foo": { "field": { "xsi.type": "xsd.int", "value": 10 } } }
Json in MOXy 2.6.0:
{ "foo": { "field": { "xsi.type": "int", "value": 10 } } }
Backward Compatibility
To provide backward compatibility options, new system properties and JAXBContext/Marshaller/Unmarshaller properties are introduced:
org.eclipse.persistence.json.type-compatibility
org.eclipse.persistence.json.use-xsd-types-prefix
When migrating from 2.5.x to 2.6, the simplest way is to set system property org.eclipse.persistence.json.type-compatibility to true. Alternatively there is option to set this property for Marshaller or Unmarshaller:
JAXBContext context = JAXBContext.newInstance(Foo.class);
Unmarshaller unmarshaller = context.createUnmarshaller(); unmarshaller.setProperty(JAXBContextProperties.MEDIA_TYPE, MediaType.APPLICATION_JSON); unmarshaller.setProperty(JAXBContextProperties.JSON_TYPE_COMPATIBILITY, true);
Marshaller marshaller = context.createMarshaller(); marshaller.setProperty(JAXBContextProperties.MEDIA_TYPE, MediaType.APPLICATION_JSON); marshaller.setProperty(JAXBContextProperties.JSON_TYPE_COMPATIBILITY, true);
To override default behavior for simple xsd types, set JAXBContextProperties.JSON_USE_XSD_TYPES_WITH_PREFIX property to true.