add methods

This commit is contained in:
Looly 2024-10-02 14:57:15 +08:00
parent 3e79778272
commit 463a8308e0
7 changed files with 245 additions and 9 deletions

View File

@ -112,11 +112,69 @@ public class JSONArray extends ListWrapper<JSON> implements JSON, JSONGetter<Int
return this.raw.get(key);
}
// region ----- addValue
/**
* 加入{@code null}元素如果设置中忽略null值则忽略
*
* @return this.
*/
public JSONArray addNull() {
this.add(null);
return this;
}
/**
* Append an object value. This increases the array's length by one. <br>
* 加入元素数组长度+1等同于 {@link JSONArray#add(Object)}
*
* @param value 可以是 Boolean, Double, Integer, JSONArray, JSONObject, Long, or String, or the JSONNull.NULL
* @param value Number值
* @return this.
*/
public JSONArray addValue(final Boolean value) {
// add时不解析字符串而是作为JSONPrimitive对待
this.add(this.factory.ofPrimitive(value));
return this;
}
/**
* 加入元素数组长度+1等同于 {@link JSONArray#add(Object)}
*
* @param value Number值
* @return this.
*/
public JSONArray addValue(final Number value) {
// add时不解析字符串而是作为JSONPrimitive对待
this.add(this.factory.ofPrimitive(value));
return this;
}
/**
* 加入元素数组长度+1等同于 {@link JSONArray#add(Object)}
*
* @param value Character值
* @return this.
*/
public JSONArray addValue(final Character value) {
// add时不解析字符串而是作为JSONPrimitive对待
this.add(this.factory.ofPrimitive(value));
return this;
}
/**
* 加入元素数组长度+1等同于 {@link JSONArray#add(Object)}
*
* @param value String值
* @return this.
*/
public JSONArray addValue(final String value) {
// add时不解析字符串而是作为JSONPrimitive对待
this.add(this.factory.ofPrimitive(value));
return this;
}
/**
* 加入元素数组长度+1等同于 {@link JSONArray#add(Object)}
*
* @param value 可以是 Boolean, Double, Integer, JSONArray, JSONObject, Long, or String, or the {@code null}
* @return this.
*/
public JSONArray addValue(final Object value) {
@ -124,6 +182,7 @@ public class JSONArray extends ListWrapper<JSON> implements JSON, JSONGetter<Int
this.add(this.factory.getMapper().toJSON(value, false));
return this;
}
// endregion
/**
* 根据给定名列表与其位置对应的值组成JSONObject
@ -204,6 +263,7 @@ public class JSONArray extends ListWrapper<JSON> implements JSON, JSONGetter<Int
return this.raw.set(index, element);
}
// region ----- add
@Override
public boolean add(final JSON element) {
if (null == element && config().isIgnoreNullValue()) {
@ -235,8 +295,8 @@ public class JSONArray extends ListWrapper<JSON> implements JSON, JSONGetter<Int
}
this.add(element);
}
}
// endregion
@Override
@SuppressWarnings({"unchecked"})

View File

@ -227,6 +227,70 @@ public class JSONObject extends MapWrapper<String, JSON> implements JSON, JSONGe
return this;
}
/**
* 设置设置{@code null}在忽略null模式下移除对应键值对
*
* @param key
* @return this.
*/
public JSONObject putNull(final String key){
this.put(key, null);
return this;
}
/**
* 设置键值对到JSONObject中在忽略null模式下如果值为{@code null}将此键移除
*
* @param key
* @param value Boolean类型对象
* @return this.
* @throws JSONException 值是无穷数字抛出此异常
*/
public JSONObject putValue(final String key, final Boolean value) throws JSONException {
this.put(key, factory.ofPrimitive(value));
return this;
}
/**
* 设置键值对到JSONObject中在忽略null模式下如果值为{@code null}将此键移除
*
* @param key
* @param value Number类型对象
* @return this.
* @throws JSONException 值是无穷数字抛出此异常
*/
public JSONObject putValue(final String key, final Number value) throws JSONException {
this.put(key, factory.ofPrimitive(value));
return this;
}
/**
* 设置键值对到JSONObject中在忽略null模式下如果值为{@code null}将此键移除
*
* @param key
* @param value Character类型对象
* @return this.
* @throws JSONException 值是无穷数字抛出此异常
*/
public JSONObject putValue(final String key, final Character value) throws JSONException {
this.put(key, factory.ofPrimitive(value));
return this;
}
/**
* 设置键值对到JSONObject中在忽略null模式下如果值为{@code null}将此键移除
*
* @param key
* @param value String类型对象
* @return this.
* @throws JSONException 值是无穷数字抛出此异常
*/
public JSONObject putValue(final String key, final String value) throws JSONException {
// put时不解析字符串而是作为JSONPrimitive对待
this.put(key, factory.ofPrimitive(value));
return this;
}
/**
* 设置键值对到JSONObject中在忽略null模式下如果值为{@code null}将此键移除
*
@ -236,6 +300,9 @@ public class JSONObject extends MapWrapper<String, JSON> implements JSON, JSONGe
* @throws JSONException 值是无穷数字抛出此异常
*/
public JSONObject putValue(final String key, final Object value) throws JSONException {
if(null == value){
return putNull(key);
}
// put时如果value为字符串不解析而是作为JSONPrimitive对待
this.put(key, factory.getMapper().toJSON(value, false));
return this;

View File

@ -300,7 +300,7 @@ public class JSONArrayTest {
@Test
public void putNullTest() {
final JSONArray array = JSONUtil.ofArray(JSONConfig.of().setIgnoreNullValue(false));
array.addValue(null);
array.addNull();
assertEquals("[null]", array.toString());
}

View File

@ -51,22 +51,22 @@ public class JSONNullTest {
@Test
public void setNullTest(){
// 忽略null
String json1 = JSONUtil.ofObj().putValue("key1", null).toString();
String json1 = JSONUtil.ofObj().putNull("key1").toString();
Assertions.assertEquals("{}", json1);
// 不忽略null
json1 = JSONUtil.ofObj(JSONConfig.of().setIgnoreNullValue(false)).putValue("key1", null).toString();
json1 = JSONUtil.ofObj(JSONConfig.of().setIgnoreNullValue(false)).putNull("key1").toString();
Assertions.assertEquals("{\"key1\":null}", json1);
}
@Test
public void setNullOfJSONArrayTest(){
// 忽略null
String json1 = JSONUtil.ofArray().addValue(null).toString();
String json1 = JSONUtil.ofArray().addNull().toString();
Assertions.assertEquals("[]", json1);
// 不忽略null
json1 = JSONUtil.ofArray(JSONConfig.of().setIgnoreNullValue(false)).addValue(null).toString();
json1 = JSONUtil.ofArray(JSONConfig.of().setIgnoreNullValue(false)).addNull().toString();
Assertions.assertEquals("[null]", json1);
}
}

View File

@ -730,7 +730,7 @@ public class JSONObjectTest {
@Test
public void nullToEmptyTest() {
final JSONObject json1 = JSONUtil.ofObj(JSONConfig.of().setIgnoreNullValue(false))
.putValue("a", null)
.putNull("a")
.putValue("b", "value2");
final String s = json1.toJSONString(0, (pair) -> {

View File

@ -0,0 +1,70 @@
package org.dromara.hutool.json.jmh;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.JsonNodeFactory;
import com.google.gson.JsonArray;
import org.dromara.hutool.core.lang.Console;
import org.dromara.hutool.core.util.RandomUtil;
import org.dromara.hutool.json.JSONArray;
import org.openjdk.jmh.annotations.*;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
/**
* 测试JSON树结构转JSON字符串性能
*/
@BenchmarkMode(Mode.AverageTime)//每次执行平均花费时间
@Warmup(iterations = 1, time = 1) //预热5次调用
@Measurement(iterations = 1, time = 1, timeUnit = TimeUnit.SECONDS) // 执行5此每次1秒
@Threads(1) //单线程
@Fork(1) //
@OutputTimeUnit(TimeUnit.NANOSECONDS) // 单位纳秒
@State(Scope.Benchmark) // 共享域
public class JsonAddJmh {
List<String> testData;
private JSONArray hutoolJSON;
private JsonArray gson;
private com.alibaba.fastjson2.JSONArray fastJSON;
private ArrayNode jackson;
@Setup
public void setup() {
Console.log("准备数据。。。");
testData = new ArrayList<>(10);
for (int i = 0; i < 10; i++) {
testData.add(RandomUtil.randomString(20));
}
hutoolJSON = new JSONArray();
gson = new JsonArray();
fastJSON = new com.alibaba.fastjson2.JSONArray();
jackson = JsonNodeFactory.instance.arrayNode();
Console.log("数据完毕");
}
@Benchmark
public void gsonJmh() {
testData.forEach(gson::add);
}
@Benchmark
public void hutoolJmh() {
testData.forEach(hutoolJSON::addValue);
//hutoolJSON.putAllObj(testData);
}
@SuppressWarnings("UseBulkOperation")
@Benchmark
public void fastJSONJmh() {
testData.forEach(fastJSON::add);
}
@Benchmark
public void jacksonJmh(){
testData.forEach(jackson::add);
}
}

View File

@ -0,0 +1,39 @@
package org.dromara.hutool.json.serializer;
import org.dromara.hutool.core.date.DateUtil;
import org.dromara.hutool.core.date.StopWatch;
import org.dromara.hutool.core.lang.Console;
import org.dromara.hutool.json.JSONFactory;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
public class JSONMapperTest {
/**
* Mapper性能耗费较多
*/
@Test
@Disabled
void toJSONTest() {
final JSONFactory factory = JSONFactory.getInstance();
final JSONMapper mapper = factory.getMapper();
final StopWatch stopWatch = DateUtil.createStopWatch();
final int count = 1000;
stopWatch.start("use mapper");
for (int i = 0; i < count; i++) {
mapper.toJSON("qbw123", false);
}
stopWatch.stop();
stopWatch.start("use ofPrimitive");
for (int i = 0; i < count; i++) {
factory.ofPrimitive("qbw123");
}
stopWatch.stop();
Console.log(stopWatch.prettyPrint());
}
}