summaryrefslogtreecommitdiff
path: root/django
diff options
context:
space:
mode:
authorHasan Ramezani <hasan.r67@gmail.com>2020-03-23 19:31:49 +0100
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2020-06-17 11:12:18 +0200
commit47651eadb8ca7aacddad41da4df64fd2af11faae (patch)
tree95b9cc540d48ee95303e1abda11deda9d566fb65 /django
parent82da72b74851808c08ec98fe609efe52609f29ad (diff)
Fixed #30583 -- Fixed handling JSONFields in XML serializer.
Co-authored-by: Chason Chaffin <chason@gmail.com>
Diffstat (limited to 'django')
-rw-r--r--django/core/serializers/xml_serializer.py12
1 files changed, 10 insertions, 2 deletions
diff --git a/django/core/serializers/xml_serializer.py b/django/core/serializers/xml_serializer.py
index 07de9428e7..88bfa59032 100644
--- a/django/core/serializers/xml_serializer.py
+++ b/django/core/serializers/xml_serializer.py
@@ -1,7 +1,7 @@
"""
XML serializer.
"""
-
+import json
from xml.dom import pulldom
from xml.sax import handler
from xml.sax.expatreader import ExpatParser as _ExpatParser
@@ -75,8 +75,13 @@ class Serializer(base.Serializer):
# Get a "string version" of the object's data.
if getattr(obj, field.name) is not None:
+ value = field.value_to_string(obj)
+ if field.get_internal_type() == 'JSONField':
+ # Dump value since JSONField.value_to_string() doesn't output
+ # strings.
+ value = json.dumps(value, cls=field.encoder)
try:
- self.xml.characters(field.value_to_string(obj))
+ self.xml.characters(value)
except UnserializableContentError:
raise ValueError("%s.%s (pk:%s) contains unserializable characters" % (
obj.__class__.__name__, field.name, obj.pk))
@@ -232,6 +237,9 @@ class Deserializer(base.Deserializer):
value = None
else:
value = field.to_python(getInnerText(field_node).strip())
+ # Load value since JSONField.to_python() outputs strings.
+ if field.get_internal_type() == 'JSONField':
+ value = json.loads(value, cls=field.decoder)
data[field.name] = value
obj = base.build_instance(Model, data, self.db)