我想实现一组名为 toJson()
的通用函数将对象转换为 JSON 字符串。与这篇文章非常相似,How to symmetrically implement serialize and deserialize template functions in C++
目前我只需要支持以下类型boolean
, double
, int
, long
, String
、数组和 ArrayList
,并允许任意组合,例如 int[][][][][]
, ArrayList<ArrayList<int[]>>
等
序列化器.java:
import java.util.ArrayList;
public interface Serializer {
static String toJson(boolean value) {
return String.valueOf(value);
}
static String toJson(double value) {
return String.valueOf(value);
}
static String toJson(int value) {
return String.valueOf(value);
}
static String toJson(long value) {
return String.valueOf(value);
}
static String toJson(final String value) {
return "\"" + value + "\"";
}
static <T> String toJson(final T value) {
return String.valueOf(value);
}
static <T> String toJson(final T[] value) {
final StringBuilder result = new StringBuilder("[");
for (final T i : value) {
result.append(toJson(i));
result.append(',');
}
if (value.length > 0) result.delete(result.length() - 1, result.length());
result.append(']');
return result.toString();
}
static <T> String toJson(final ArrayList<T> value) {
final StringBuilder result = new StringBuilder("[");
for (final T i : value) {
result.append(toJson(i));
result.append(',');
}
if (value.size() > 0) result.delete(result.length() - 1, result.length());
result.append(']');
return result.toString();
}
}
单元测试:
import org.junit.Test;
import java.util.Arrays;
import static org.junit.Assert.assertEquals;
public class SerializerTest {
@Test public void primitiveToJsonTest() {
assertEquals("true", Serializer.toJson(true));
assertEquals("123.0", Serializer.toJson(123.000));
assertEquals("123", Serializer.toJson(123));
assertEquals("123", Serializer.toJson(123L));
assertEquals("\"123\"", Serializer.toJson("123"));
}
@Test public void containerToJsonTest() {
System.out.println(Serializer.toJson(new int[]{1,2,3,4,5})); // not correct !
assertEquals("[1, 2, 3, 4, 5]", Serializer.toJson(Arrays.asList(1,2,3,4,5)));
assertEquals("[[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]]",
Serializer.toJson(Arrays.asList(Arrays.asList(1,2,3,4,5), Arrays.asList(6,7,8,9, 10))));
}
}
唯一的问题是关于数组的,看来Java会处理T[]
如T
.
有什么想法吗?
最佳答案
您实现的数组情况仅涵盖对象数组(例如Integer[]
),您需要分别处理int[]
和其他基本数组类型 - - 就像你处理 int
等一样。
这只是第一级的问题。对于 int[][]
等,“外部”数组是一个对象数组,因为 int[]
是一个 Object
所以覆盖一个级别就足够了。
关于java - 实现一组名为 `toJson()` 的 Java 泛型函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32757492/