1.8.8 Adding JSON as key in a JSONObject

Discussion in 'Spigot Plugin Development' started by illuminator3, Feb 21, 2020.

  1. So basically I need to add a JSON (key & value) as the key in a JSONObject.
    Code (Java):
            final JsonStatsAPI api = new JsonStatsAPI();
            final UUID uuid = UUID.randomUUID();

            System.out.println("uuid: " + uuid + "\n\n");

            api.set(uuid, "cool", new JsonStatsAPI.Value<>(true));

            System.out.println(api.serialize());
    Code (Java):
    /**
         * @return
         */

        public String serialize()
        {
            return new GsonBuilder().setPrettyPrinting().create().toJson(this.getJSON());
        }

        @SuppressWarnings("unchecked")
        public JSONObject getJSON()
        {
            final JSONObject json = new JSONObject();

            for (final UUID key : MAP.keySet())
            {
                for (final JsonStatsAPI.DoubleValue<String, JsonStatsAPI.Value<?>> value : MAP.get(key))
                {
                    if (value.getValue2() instanceof Collection<?>)
                        json.put(key, new Object[] { value.getValue1(), ((Collection<?>) value.getValue2()).toArray() });
                    else
                        json.put(key, new Object[] { value.getValue1(), value.getValue2().getValue() });
                }
            }

            return json;
        }
    Code (Java):
    uuid: eb1bd8a6-b462-48c0-ad0a-dbd82d2646c7


    {
      "eb1bd8a6-b462-48c0-ad0a-dbd82d2646c7": [
        "cool",
        true
      ]
    }

    But what do I need to do that the output is the following?
    Code (Text):
    uuid: eb1bd8a6-b462-48c0-ad0a-dbd82d2646c7


    {
      "eb1bd8a6-b462-48c0-ad0a-dbd82d2646c7": [
        "cool": true
      ]
    }
     
  2. It's because you set a List inside your JSONObject. Try to put a HashMap
     
  3. Works fine with this code:
    Code (Java):
        @SuppressWarnings("unchecked")
        public JSONObject getJSON()
        {
            final JSONObject json = new JSONObject();

            for (final UUID key : MAP.keySet())
            {
                for (final JsonStatsAPI.DoubleValue<String, JsonStatsAPI.Value<?>> value : MAP.get(key))
                {
                    if (value.getValue2().getValue() instanceof Collection<?>)
                    {
                        if (json.containsKey(key))
                        {
                            final Map<String, Object> map = (Map<String, Object>) json.get(key);

                            map.put(value.getValue1(), ((Collection<?>) value.getValue2().getValue()).toArray());

                            json.put(key, map);
                        }
                        else
                        {
                            final Map<String, Object> map = new HashMap<>();

                            map.put(value.getValue1(), value.getValue2().getValue());

                            json.put(key, map);
                        }
                    }
                    else
                    {
                        if (json.containsKey(key))
                        {
                            final Map<String, Object> map = (Map<String, Object>) json.get(key);

                            map.put(value.getValue1(), value.getValue2().getValue());

                            json.put(key, map);
                        }
                        else
                        {
                            final Map<String, Object> map = new HashMap<>();

                            map.put(value.getValue1(), value.getValue2().getValue());

                            json.put(key, map);
                        }
                    }
                }
            }

            return json;
        }

    But how would I do the deserialization process?
     
  4. Like this ?
    Code (Text):

            String json_text = json.toString();//If you receive a JsonObject just ignore this ligne
            try {
                JSONObject deserialize_test = new JSONObject(json_text);//If you receive a JsonObject just ignore this ligne
                HashMap<String, Boolean> test_hash = new Gson().fromJson(deserialize_test.get("eb1bd8a6-b462-48c0-ad0a-dbd82d2646c7").toString(), HashMap.class);
            } catch (JSONException e1) {
                e1.printStackTrace();
            }
     
  5. Code (Java):
        @SuppressWarnings("unchecked")
        @NotNull
        @Contract(pure = true)
        public static JsonStatsAPI deserialize(final String str)
        {
            final JSONParser parser = new JSONParser();
            final JSONObject json;

            try
            {
                json = (JSONObject) parser.parse(str);
            } catch (final ParseException ex)
            {
                throw new RuntimeException(ex);
            }

            final JsonStatsAPI api = new JsonStatsAPI();

            for (final Object obj : json.keySet())
            {
                final String key = (String) obj;

                if (key.equals("type") || key.equals("version"))
                    continue;

                final UUID owner = UUID.fromString(key);
                final Map<?, Value<?>> map = new Gson().fromJson(json.get(key).toString(), Map.class);

                for (final Object key2 : map.keySet())
                {
                    final String strKey2 = key2.toString();
                    final Value<?> value = new Value<>(map.get(key2));

                    api.set(owner, strKey2, value);
                }
            }

            return api;
        }
     
  6. It looks good but I'm not sure if JSONParser is really necessary. I don't know if you receive the all json or a good formatted string but you can try to use new JSONObject(str)