smeeeth / json-simple

Automatically exported from code.google.com/p/json-simple
Apache License 2.0
0 stars 0 forks source link

Object[] not serializable #2

Closed GoogleCodeExporter closed 8 years ago

GoogleCodeExporter commented 8 years ago
What steps will reproduce the problem?

Create a Object[] and then try to transform to a JSON string.
In example: org.json.simple.JSONValue.toJSONString(new Object[] {"1"})

What is the expected output? What do you see instead?

The output should be like the java.util.List's output. I.e.: ["1"]
The call returns a "toString()" output. I.e.: [Ljava.lang.Object;@2ad191

What version of the product are you using? On what operating system?

json_simple-1.1.jar

Please provide any additional information below.

Original issue reported on code.google.com by atec.post on 19 Feb 2009 at 12:51

GoogleCodeExporter commented 8 years ago
JSON.simple currently doesn't support direct serialization of Java arrays, you 
need
to use java.util.List instead:

List list = new ArrayList();
list.add("1");
org.json.simple.JSONValue.toJSONString(list);

Please refer the following link for more information:
http://code.google.com/p/json-simple/wiki/MappingBetweenJSONAndJavaEntities

Thanks.

Original comment by fangyid...@gmail.com on 20 Feb 2009 at 4:39

GoogleCodeExporter commented 8 years ago
Hi,

I have read the link you posted, but the array that I want to encode to 
JSON-string
is the a part of a composite object that I can't work (easily) with.

I worked on a _simple_ encoder (working with arrays too):

// ------------------
@SuppressWarnings("unchecked")
public static String toJSString(final Object object) {

    if (object == null)
        return "null";

    final StringBuilder sb = new StringBuilder();

    if (object instanceof Map) {
        final Map<Object, Object> map = (Map<Object, Object>) object;
        sb.append('{');
        final Set<Entry<Object, Object>> entrySet = map.entrySet();
        for (Iterator iterator = entrySet.iterator(); iterator.hasNext();) {
            final Entry<Object, Object> entry = (Entry<Object, Object>) iterator
                    .next();

            sb.append(entry.getKey().toString());
            sb.append(':');
            sb.append(toJSString(entry.getValue()));
            if (iterator.hasNext())
                sb.append(",\n");

        }
        sb.append('}');
    } else if (object instanceof Object[]) {
        final Object[] obj = (Object[]) object;
        sb.append('[');
        for (int i = 0; i < obj.length; i++) {
            sb.append(toJSString(obj[i]));
            if (i + 1 < obj.length)
                sb.append(',');
        }
        sb.append(']');
    } else if (object instanceof Collection) {
        final Collection obj = (Collection) object;
        sb.append('[');
        for (Iterator iterator = obj.iterator(); iterator.hasNext();) {
            Object object2 = (Object) iterator.next();
            sb.append(toJSString(object2));
            if (iterator.hasNext())
                sb.append(',');

        }
        sb.append(']');
    } else if (object instanceof Number) {
        sb.append(object);
    } else {
        sb.append('"').append(object.toString().replaceAll("\"", "\\\\\""))
                .append('"');
    }

    return sb.toString();
}
// ------------------

It's far from complete/normative but it simply works :)

Regards,
Alejandro.

Original comment by atec.post on 20 Feb 2009 at 8:47

GoogleCodeExporter commented 8 years ago
Sorry, I forgot to say that java.lang.Array class is final and it can't 
implement
JSONAware interface.

I have seen other JSON libraries that uses a "registration" model to customize 
the
output.
In example, some kind of: 
JSONAwareFactory.registerJSONAware(java.lang.Array.class,
new MyArrayJSONAware());

It could be nice to implement this feature to complete the output customization 
service.

Regards,
Alejandro.

Original comment by atec.post on 20 Feb 2009 at 8:58

GoogleCodeExporter commented 8 years ago
Yes, each library strikes to keep the balance among convenience, performance and
neatness of the code...We'll consider this kind of feature in next step of this 
project:

Auto marshalling and unmarshalling utils for Java Beans 

Now please feel free to use your modified version. Thank you for the feedback.

Original comment by fangyid...@gmail.com on 20 Feb 2009 at 10:39