java - 实现一组名为 `toJson()` 的 Java 泛型函数

标签 java generics

我想实现一组名为 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/

相关文章:

java - 缺少具有 EmbeddedId 的实体的默认构造函数

java - 我写了一个通用的有序数组类,比较元素时插入方法出现空指针错误

generics - 在应用程序 : problem with type inference 之前选择函数引用

c# - 如何从 Generic List<T> 创建 CSV 字符串

java - 参数化类型和泛型类

java - 将 2d vector 作为 vec4 传递到 OpenGL ES 2.0 着色器

java - 无法在从 Java 启动的子进程中为 SIGQUIT 设置信号处理程序

java - JSP表单插入数据库时​​返回空值

java - 为什么可能 arrayList 只显示一个字符串?

c# - 将类型参数传递给用于指定泛型类型的方法