This commit is contained in:
Looly
2023-05-04 13:54:30 +08:00
parent 47ab0d02c3
commit 6d8d51ceca
18 changed files with 496 additions and 20 deletions

View File

@@ -20,10 +20,12 @@ import org.dromara.hutool.core.convert.ConvertException;
import org.dromara.hutool.core.convert.Converter;
import org.dromara.hutool.core.convert.RegisterConverter;
import org.dromara.hutool.core.convert.impl.*;
import org.dromara.hutool.core.lang.Console;
import org.dromara.hutool.core.map.MapWrapper;
import org.dromara.hutool.core.reflect.ConstructorUtil;
import org.dromara.hutool.core.reflect.TypeReference;
import org.dromara.hutool.core.reflect.TypeUtil;
import org.dromara.hutool.core.reflect.kotlin.KClassUtil;
import org.dromara.hutool.core.text.StrUtil;
import org.dromara.hutool.core.util.ObjUtil;
import org.dromara.hutool.json.*;
@@ -210,6 +212,11 @@ public class JSONConverter implements Converter {
// 尝试转Bean
if (BeanUtil.isBean(rawType)) {
// issue#I5WDP0 对于Kotlin对象由于参数可能非空限制导致无法创建一个默认的对象再赋值
if(KClassUtil.isKotlinClass(rawType) && json instanceof JSONGetter){
return KClassUtil.newInstance(rawType, new JSONGetterValueProvider<>((JSONGetter<String>)json));
}
return BeanCopier.of(json,
ConstructorUtil.newInstanceIfPossible(rawType), targetType,
InternalJSONUtil.toCopyOptions(json.config())).copy();

View File

@@ -0,0 +1,48 @@
/*
* Copyright (c) 2023 looly(loolly@aliyun.com)
* Hutool is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* http://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
*/
package org.dromara.hutool.json.convert;
import org.dromara.hutool.core.bean.copier.ValueProvider;
import org.dromara.hutool.json.JSONGetter;
import java.lang.reflect.Type;
/**
* JSONGetter的ValueProvider
*
* @param <K> 键类型
* @author looly
*/
public class JSONGetterValueProvider<K> implements ValueProvider<K> {
private final JSONGetter<K> jsonGetter;
/**
* 构造
*
* @param jsonGetter {@link JSONGetter}
*/
public JSONGetterValueProvider(final JSONGetter<K> jsonGetter) {
this.jsonGetter = jsonGetter;
}
@Override
public Object value(final K key, final Type valueType) {
return jsonGetter.get(key, valueType);
}
@Override
public boolean containsKey(final K key) {
return !jsonGetter.isNull(key);
}
}

View File

@@ -0,0 +1,18 @@
/*
* Copyright (c) 2023 looly(loolly@aliyun.com)
* Hutool is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* http://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
*/
package org.dromara.hutool.json.issueI5WDP0
data class ERPProduct(
var code:String,
var status:String
)

View File

@@ -0,0 +1,28 @@
/*
* Copyright (c) 2023 looly(loolly@aliyun.com)
* Hutool is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* http://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
*/
package org.dromara.hutool.json.issueI5WDP0;
import org.dromara.hutool.json.JSONUtil;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
public class JsonToBeanTest {
@Test
void toBeanTest() {
final String jsonStr = "{\"code\": \"201\", \"status\": \"ok\"}";
final ERPProduct bean = JSONUtil.toBean(jsonStr, ERPProduct.class);
Assertions.assertNotNull(bean);
Assertions.assertEquals("201", bean.getCode());
Assertions.assertEquals("ok", bean.getStatus());
}
}