diff --git a/storage/src/main/java/com/zfoo/storage/interpreter/ResourceInterpreter.java b/storage/src/main/java/com/zfoo/storage/interpreter/ResourceInterpreter.java index 10a83200..a5f1190d 100644 --- a/storage/src/main/java/com/zfoo/storage/interpreter/ResourceInterpreter.java +++ b/storage/src/main/java/com/zfoo/storage/interpreter/ResourceInterpreter.java @@ -41,6 +41,7 @@ public class ResourceInterpreter { static { var converters = new HashSet<>(); converters.add(new JsonToArrayConverter()); + converters.add(new JsonToListConverter()); converters.add(new JsonToMapConverter()); converters.add(new JsonToObjectConverter()); converters.add(new StringToClassConverter()); diff --git a/storage/src/main/java/com/zfoo/storage/strategy/JsonToListConverter.java b/storage/src/main/java/com/zfoo/storage/strategy/JsonToListConverter.java new file mode 100644 index 00000000..3e9eeb28 --- /dev/null +++ b/storage/src/main/java/com/zfoo/storage/strategy/JsonToListConverter.java @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2020 The zfoo Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and limitations under the License. + */ + +package com.zfoo.storage.strategy; + +import com.zfoo.protocol.util.JsonUtils; +import org.springframework.core.convert.TypeDescriptor; +import org.springframework.core.convert.converter.ConditionalGenericConverter; + +import java.util.Collections; +import java.util.List; +import java.util.Set; + +/** + * @author liqi + * @version 4.0 + */ +public class JsonToListConverter implements ConditionalGenericConverter { + + + @Override + public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) { + return sourceType.getType() == String.class && List.class.isAssignableFrom(targetType.getType()); + } + + @Override + public Set getConvertibleTypes() { + return Collections.singleton(new ConvertiblePair(String.class, List.class)); + } + + @Override + public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) { + // String content = (String) source; + // return targetType.isPrimitive() ? JsonUtil.string2Object(content, targetType.getObjectType()) + // : JsonUtil.string2Array(content, targetType.getType()); + Class clazz = null; + + String content = (String) source; + for (var v : targetType.getResolvableType().getGenerics()){ + clazz = (Class) v.getType(); + } + return Collections.unmodifiableList(JsonUtils.string2List(content, clazz)); + } +} diff --git a/storage/src/test/java/com/zfoo/storage/resource/StudentResource.java b/storage/src/test/java/com/zfoo/storage/resource/StudentResource.java index 303a3a77..fcc5db35 100644 --- a/storage/src/test/java/com/zfoo/storage/resource/StudentResource.java +++ b/storage/src/test/java/com/zfoo/storage/resource/StudentResource.java @@ -17,6 +17,8 @@ import com.zfoo.storage.model.anno.Id; import com.zfoo.storage.model.anno.Index; import com.zfoo.storage.model.anno.Resource; +import java.util.List; + /** * @author godotg * @version 4.0 @@ -37,6 +39,7 @@ public class StudentResource { private float score; private String[] courses; private User[] users; + private List userList; private User user; /** @@ -68,6 +71,10 @@ public class StudentResource { return users; } + public List getUserList() { + return userList; + } + public User getUser() { return user; } diff --git a/storage/src/test/resources/excel/StudentResource.xlsx b/storage/src/test/resources/excel/StudentResource.xlsx index d7378b7a..c0a744a4 100644 Binary files a/storage/src/test/resources/excel/StudentResource.xlsx and b/storage/src/test/resources/excel/StudentResource.xlsx differ