android & benitlux: use NitObject in clients
[nit.git] / lib / json / serialization_write.nit
index efbf22a..009e131 100644 (file)
@@ -33,7 +33,7 @@ class JsonSerializer
        #   be deserialized to their original form using `JsonDeserializer`.
        # * Use references when an object has already been serialized so to not duplicate it.
        # * Support cycles in references.
-       # * Preserve the Nit `Char` type as an object because it does not exist in JSON.
+       # * Preserve the Nit `Char` and `Byte` types as special objects.
        # * The generated JSON is standard and can be read by non-Nit programs.
        #   However, some Nit types are not represented by the simplest possible JSON representation.
        #   With the added metadata, it can be complex to read.
@@ -69,6 +69,8 @@ class JsonSerializer
        # Used only when `plain_json == true`.
        private var first_attribute = false
 
+       redef var current_object = null
+
        redef fun serialize(object)
        do
                if object == null then
@@ -88,8 +90,11 @@ class JsonSerializer
                        end
 
                        first_attribute = true
+                       var last_object = current_object
+                       current_object = object
                        object.accept_json_serializer self
                        first_attribute = false
+                       current_object = last_object
 
                        if plain_json then open_objects.pop
                end
@@ -237,10 +242,10 @@ redef class Serializable
        # which is used by all the serialization engines, not just JSON.
        protected fun accept_json_serializer(v: JsonSerializer)
        do
-               var id = v.cache.new_id_for(self)
                v.stream.write "\{"
                v.indent_level += 1
                if not v.plain_json then
+                       var id = v.cache.new_id_for(self)
                        v.new_line_and_indent
                        v.stream.write "\"__kind\": \"obj\", \"__id\": "
                        v.stream.write id.to_s
@@ -248,7 +253,7 @@ redef class Serializable
                        v.stream.write class_name
                        v.stream.write "\""
                end
-               core_serialize_to(v)
+               v.serialize_core(self)
 
                v.indent_level -= 1
                v.new_line_and_indent
@@ -281,6 +286,19 @@ redef class Char
        end
 end
 
+redef class Byte
+       redef fun accept_json_serializer(v)
+       do
+               if v.plain_json then
+                       to_i.accept_json_serializer v
+               else
+                       v.stream.write "\{\"__kind\": \"byte\", \"__val\": "
+                       to_i.accept_json_serializer v
+                       v.stream.write "\}"
+               end
+       end
+end
+
 redef class CString
        redef fun accept_json_serializer(v) do to_s.accept_json_serializer(v)
 end
@@ -312,8 +330,10 @@ end
 redef class SimpleCollection[E]
        redef fun accept_json_serializer(v)
        do
-               # Register as pseudo object
-               if not v.plain_json then
+               if v.plain_json then
+                       serialize_to_pure_json v
+               else
+                       # Register as pseudo object
                        var id = v.cache.new_id_for(self)
                        v.stream.write """{"""
                        v.indent_level += 1
@@ -324,14 +344,12 @@ redef class SimpleCollection[E]
                        v.stream.write class_name
                        v.stream.write """","""
                        v.new_line_and_indent
+
                        v.stream.write """"__items": """
                        serialize_to_pure_json v
+
                        core_serialize_to v
-               else
-                       serialize_to_pure_json v
-               end
 
-               if not v.plain_json then
                        v.indent_level -= 1
                        v.new_line_and_indent
                        v.stream.write "\}"