JSONObjectTest.java

package net.minidev.json.test;

import net.minidev.json.JSONArray;
import net.minidev.json.JSONObject;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;

class JSONObjectTest {

  @Test
  void mergeIntegerFailed() {
    JSONObject jsonObject1 = new JSONObject();
    jsonObject1.appendField("k1", 1);
    Assertions.assertEquals("{\"k1\":1}", jsonObject1.toJSONString());

    // replace with new value by Map merge
    jsonObject1.merge("k1", 11, (oldValue, newValue) -> newValue);
    Assertions.assertEquals("{\"k1\":11}", jsonObject1.toJSONString());

    JSONObject jsonObject3 = new JSONObject();
    jsonObject3.appendField("k2", 2);
    jsonObject1.merge(jsonObject3);
    Assertions.assertEquals("{\"k1\":11,\"k2\":2}", jsonObject1.toJSONString());

    // replace with new value by JSONObject merge will fail
    Exception exception =
        Assertions.assertThrows(
            RuntimeException.class,
            () -> {
              JSONObject jsonObject2 = new JSONObject();
              jsonObject2.appendField("k1", 101);
              jsonObject1.merge(jsonObject2);
            });

    Assertions.assertEquals(
        exception.getMessage(), "JSON merge can not merge two java.lang.Integer Object together");
  }

  @Test
  void mergeStringFailed() {
    JSONObject jsonObject1 = new JSONObject();
    jsonObject1.appendField("k1", "v1");
    Assertions.assertEquals("{\"k1\":\"v1\"}", jsonObject1.toJSONString());

    // replace with new value by Map merge
    jsonObject1.merge("k1", "vNew1", (oldValue, newValue) -> newValue);
    Assertions.assertEquals("{\"k1\":\"vNew1\"}", jsonObject1.toJSONString());

    JSONObject jsonObject3 = new JSONObject();
    jsonObject3.appendField("k2", "v2");
    jsonObject1.merge(jsonObject3);
    Assertions.assertEquals("{\"k1\":\"vNew1\",\"k2\":\"v2\"}", jsonObject1.toJSONString());

    // replace with new value by JSONObject merge will fail
    Exception exception =
        Assertions.assertThrows(
            RuntimeException.class,
            () -> {
              JSONObject jsonObject2 = new JSONObject();
              jsonObject2.appendField("k1", "vNew2");
              jsonObject1.merge(jsonObject2);
              System.out.println(jsonObject1.toJSONString());
            });

    Assertions.assertEquals(
        exception.getMessage(), "JSON merge can not merge two java.lang.String Object together");
  }

  @Test
  void mergeJsonObjectFailed() {
    JSONObject jsonObject1 = new JSONObject();
    jsonObject1.appendField("k1", "v1");
    Assertions.assertEquals("{\"k1\":\"v1\"}", jsonObject1.toJSONString());

    JSONObject jsonObject2 = new JSONObject();
    jsonObject2.appendField("k2", jsonObject1);
    Assertions.assertEquals("{\"k2\":{\"k1\":\"v1\"}}", jsonObject2.toJSONString());

    // replace with new value by JSONObject merge will fail
    JSONObject jsonObject3 = new JSONObject();
    jsonObject3.appendField("k1", "vNew1");

    JSONObject jsonObject4 = new JSONObject();
    jsonObject4.appendField("k2", jsonObject3);
    Assertions.assertEquals("{\"k2\":{\"k1\":\"vNew1\"}}", jsonObject4.toJSONString());

    Exception exception =
        Assertions.assertThrows(
            RuntimeException.class,
            () -> {
              jsonObject4.merge(jsonObject2);
            });

    Assertions.assertEquals(
        exception.getMessage(), "JSON merge can not merge two java.lang.String Object together");
  }

  @Test
  void mergeJsonArraySuccess() {
    JSONObject jsonObject1 = new JSONObject();
    jsonObject1.appendField("k1", "v1");
    JSONObject jsonObject2 = new JSONObject();
    jsonObject2.appendField("k2", "v2");

    JSONArray jsonArray1 = new JSONArray();
    jsonArray1.add(jsonObject1);
    jsonArray1.add(jsonObject2);
    Assertions.assertEquals("[{\"k1\":\"v1\"},{\"k2\":\"v2\"}]", jsonArray1.toJSONString());

    // replace with new value by JSONObject merge will fail
    JSONObject jsonObject3 = new JSONObject();
    jsonObject3.appendField("k1", "vNew1");
    JSONObject jsonObject4 = new JSONObject();
    jsonObject4.appendField("k2", "vNew2");

    JSONArray jsonArray2 = new JSONArray();
    jsonArray2.add(jsonObject3);
    jsonArray2.add(jsonObject4);
    Assertions.assertEquals("[{\"k1\":\"vNew1\"},{\"k2\":\"vNew2\"}]", jsonArray2.toJSONString());

    jsonArray2.merge(jsonArray1);
    Assertions.assertEquals(
        "[{\"k1\":\"vNew1\"},{\"k2\":\"vNew2\"},{\"k1\":\"v1\"},{\"k2\":\"v2\"}]",
        jsonArray2.toJSONString());
  }

  @Test
  void mergeIntegerWithOverwriteSuccess() {
    JSONObject jsonObject1 = new JSONObject();
    jsonObject1.appendField("k1", 1);
    Assertions.assertEquals("{\"k1\":1}", jsonObject1.toJSONString());

    // replace with new value by Map merge
    jsonObject1.merge("k1", 11, (oldValue, newValue) -> newValue);
    Assertions.assertEquals("{\"k1\":11}", jsonObject1.toJSONString());

    JSONObject jsonObject3 = new JSONObject();
    jsonObject3.appendField("k2", 2);
    jsonObject1.merge(jsonObject3);
    Assertions.assertEquals("{\"k1\":11,\"k2\":2}", jsonObject1.toJSONString());

    // replace with new value by JSONObject merge with override success
    JSONObject jsonObject2 = new JSONObject();
    jsonObject2.appendField("k1", 101);
    jsonObject1.merge(jsonObject2, true);
    Assertions.assertEquals("{\"k1\":101,\"k2\":2}", jsonObject1.toJSONString());
  }

  @Test
  void mergeStringWithOverwriteSuccess() {
    JSONObject jsonObject1 = new JSONObject();
    jsonObject1.appendField("k1", "v1");
    Assertions.assertEquals("{\"k1\":\"v1\"}", jsonObject1.toJSONString());

    // replace with new value by Map merge
    jsonObject1.merge("k1", "vNew1", (oldValue, newValue) -> newValue);
    Assertions.assertEquals("{\"k1\":\"vNew1\"}", jsonObject1.toJSONString());

    JSONObject jsonObject3 = new JSONObject();
    jsonObject3.appendField("k2", "v2");
    jsonObject1.merge(jsonObject3);
    Assertions.assertEquals("{\"k1\":\"vNew1\",\"k2\":\"v2\"}", jsonObject1.toJSONString());

    // replace with new value by JSONObject merge with override success
    JSONObject jsonObject2 = new JSONObject();
    jsonObject2.appendField("k1", "vNew2");
    jsonObject1.merge(jsonObject2, true);
    Assertions.assertEquals("{\"k1\":\"vNew2\",\"k2\":\"v2\"}", jsonObject1.toJSONString());
  }

  @Test
  void mergeJsonObjectWithOverwriteSuccess() {
    JSONObject jsonObject1 = new JSONObject();
    jsonObject1.appendField("k1", "v1");
    Assertions.assertEquals("{\"k1\":\"v1\"}", jsonObject1.toJSONString());

    JSONObject jsonObject2 = new JSONObject();
    jsonObject2.appendField("k2", jsonObject1);
    Assertions.assertEquals("{\"k2\":{\"k1\":\"v1\"}}", jsonObject2.toJSONString());

    // JSONObject merge will overwrite jsonObject3 by jsonObject2
    JSONObject jsonObject3 = new JSONObject();
    jsonObject3.appendField("k1", "vNew1");

    JSONObject jsonObject4 = new JSONObject();
    jsonObject4.appendField("k2", jsonObject3);
    Assertions.assertEquals("{\"k2\":{\"k1\":\"vNew1\"}}", jsonObject4.toJSONString());

    jsonObject4.merge(jsonObject2, true);
    Assertions.assertEquals("{\"k2\":{\"k1\":\"v1\"}}", jsonObject4.toJSONString());
  }

  @Test
  void mergeJsonArrayWithObjectSuccess() {
    JSONObject jsonObject1 = new JSONObject();
    jsonObject1.appendField("k1", "v1");

    JSONArray jsonArray1 = new JSONArray();
    jsonArray1.add(jsonObject1);
    Assertions.assertEquals("[{\"k1\":\"v1\"}]", jsonArray1.toJSONString());

    JSONObject jsonObject2 = new JSONObject();
    jsonObject2.appendField("k2", "v2");

    /*
       test merge json object ( before fix issue #51, these will fail.
       throw java.lang.ClassCastException:  class net.minidev.json.JSONObject cannot be cast to class net.minidev.json.JSONArray)
    */
    jsonArray1.merge(jsonObject2);
    Assertions.assertEquals("[{\"k1\":\"v1\"},{\"k2\":\"v2\"}]", jsonArray1.toJSONString());

    jsonArray1.merge("s1");
    Assertions.assertEquals("[{\"k1\":\"v1\"},{\"k2\":\"v2\"},\"s1\"]", jsonArray1.toJSONString());

    jsonArray1.merge(1);
    Assertions.assertEquals(
        "[{\"k1\":\"v1\"},{\"k2\":\"v2\"},\"s1\",1]", jsonArray1.toJSONString());

    jsonArray1.merge(true);
    Assertions.assertEquals(
        "[{\"k1\":\"v1\"},{\"k2\":\"v2\"},\"s1\",1,true]", jsonArray1.toJSONString());

    // test merge json array
    JSONObject jsonObject3 = new JSONObject();
    jsonObject3.appendField("k3", "v3");
    JSONArray jsonArray2 = new JSONArray();
    jsonArray2.add(jsonObject3);

    jsonArray1.merge(jsonArray2);
    Assertions.assertEquals(
        "[{\"k1\":\"v1\"},{\"k2\":\"v2\"},\"s1\",1,true,{\"k3\":\"v3\"}]",
        jsonArray1.toJSONString());
  }
}