From b989f8969a173ccc766276c8780857b138385309 Mon Sep 17 00:00:00 2001 From: Tony Germano Date: Thu, 15 Apr 2021 21:14:35 -0400 Subject: [PATCH] fixed nested java objects in json.stringify --- src/org/mozilla/javascript/NativeJSON.java | 10 +++++++--- testsrc/jstests/stringify-java-objects.js | 23 ++++++++++++++++++++++ 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/src/org/mozilla/javascript/NativeJSON.java b/src/org/mozilla/javascript/NativeJSON.java index dccfca738c..f635fa2bbc 100644 --- a/src/org/mozilla/javascript/NativeJSON.java +++ b/src/org/mozilla/javascript/NativeJSON.java @@ -298,10 +298,10 @@ private static Object str(Object key, Scriptable holder, value = ((NativeJavaObject) value).unwrap(); if (value instanceof Map) { Map map = (Map) value; - NativeObject nObj = new NativeObject(); + Scriptable nObj = state.cx.newObject(state.scope); map.forEach((k, v) -> { if (k instanceof CharSequence) { - nObj.put(((CharSequence) k).toString(), nObj, v); + nObj.put(((CharSequence) k).toString(), nObj, state.cx.getWrapFactory().wrap(state.cx, state.scope, v, v.getClass())); } }); value = nObj; @@ -312,7 +312,11 @@ private static Object str(Object key, Scriptable holder, value = col.toArray(new Object[col.size()]); } if (value instanceof Object[]) { - value = new NativeArray((Object[]) value); + Object[] elements = (Object[]) value; + elements = Arrays.stream(elements) + .map(o -> state.cx.getWrapFactory().wrap(state.cx, state.scope, o, o.getClass())) + .toArray(); + value = state.cx.newArray(state.scope, elements); } } } diff --git a/testsrc/jstests/stringify-java-objects.js b/testsrc/jstests/stringify-java-objects.js index f5957b0809..c666f1e85e 100644 --- a/testsrc/jstests/stringify-java-objects.js +++ b/testsrc/jstests/stringify-java-objects.js @@ -144,4 +144,27 @@ assertTrue(expected.test(actual)); var obj = {test: javaObject}; assertThrows(()=>JSON.stringify(obj), TypeError); +// nested Maps and Lists +var map1 = new java.util.HashMap({a:1}); +var map2 = new java.util.HashMap({b:2, map1: map1}); + +var list1 = new java.util.ArrayList([1]); +var list2 = new java.util.ArrayList([2, list1]); + +var expected = JSON.stringify({ + b: 2, + map1: {a: 1} +}); +var actual = JSON.stringify(map2); +assertEquals(expected, actual); + +var expected = JSON.stringify([2, [1]]); +var actual = JSON.stringify(list2); +assertEquals(expected, actual); + +list2.add(map1); +var expected = JSON.stringify([2, [1], {a:1}]); +var actual = JSON.stringify(list2); +assertEquals(expected, actual); + "success"