截至目前,我有一个类似于下面的对象。
public class DataField implements JSONable
{
public final String name;
public final Class<?> typeClass;
private Object data;
public <T> DataField(String name, Class<T> typeClass)
{
this.name = name;
this.typeClass = typeClass;
data = null;
}
public <T> T getData(Class<T> passClass)
{
if(!typeClass.equals(passClass))
throw new TypeMismatchException("Type mismatch");
return passClass.cast(data);
}
public <T> T setData(T obj, Class<T> passClass)
{
if(!typeClass.equals(passClass))
throw new TypeMismatchException("Type mismatch");
data = (Object) obj;
}
public String toJSON()
{
//The part that bugs me
StringBuilder sb = new StringBuilder();
switch(type)
{
case "myPackage.DataField":
if(isArray)
return TakesADataObjOrCollectionOfDataObjs(sb,Arrays.asList(get(DataObj[].class)));
else
return TakesADataObjOrCollectionOfDataObjs(sb,get(DataObj.class));
break;
default:
if(isArray)
TakesAnObjectOrCollection(sb,Arrays.asList(get(Object[].class)));
else
TakesAnObjectOrCollection(sb,get(Object.class));
break;
}
return sb.toString();
}
}
//I did not include code for DataObj but it has a HashMap<String,DataField>
//fields on it and two functions for getting and setting field data
//without actually divulging the field objects themselves.
背景:问题在于最后一个toJSON
功能。我有两个不同的函数(在此列为TakesADataObjOrCollectionOfDataObjs
和TakesAnObjectOrCollection
),根据对象是否实现JSONable
来执行不同的操作。现在我无法将这些全部简化为一个函数并让编译器选择因为类型擦除,我不能拥有同时使用Collection<?>
和Collection<? extends JSONable>
的函数,因为它们具有相同的函数签名。
当我只需要区分Object
和DataObj
类型时,这很简单(这是一个非常简单的检查,我所要做的就是传递我们所用类型的Class<?>
使用)但现在我需要开始存储List<?>
和List<? extends JSONable>
。
当前解决方案:我确实为此解决方案提供了一些代码,但它与上图所示的不同。目前的解决方案只是包括我正在使用的通用类型,以及typeClass
和genericTypeClass
。这个问题是它开始变得非常混乱,因为:
typeClass
的所有适当方法现在需要两种方法,一种同时采用{{1}}和typeClass
,另一种采用genericTypeClass
但设置typeClass
}到null。genericTypeClass
切换语句将填充更多案例,每个支持的通用一个,然后在每个案例下,检查toJSON
以查看它是否为genericTypeClass
问题:有没有其他方法可以创建此类来执行我想要的操作(存储不同的数据但仍然能够根据DataObj
持有的类型输出不同的JSON)?
希望只是解释情况而不是问3或4个其他相关问题会阻止我只是问这个问题而成为XY Problem的牺牲品。
答案 0 :(得分:2)
我建议您使用 Jackson 将对象转换为 JSON字符串。
很容易上班(认真),它可以为您节省大量时间和潜在的错误......它还支持您可以使用的一些功能,我正在考虑{的序列化{1}}例如:)
以下是interesting blog to get you going with Jackson Json的链接 这是指向the download page for Jackson Json的链接。
以下是我刚刚向您展示如何使用它的一个小例子:
List
Ouptut:
public class Main {
public final String mainStr = "Hello";
public static void main(String[] args) throws JsonGenerationException, JsonMappingException, IOException {
final ObjectMapper om = new ObjectMapper();
System.out.println("Serialized Main: " + om.writeValueAsString(new Main()));
System.out.println("Serialized A: " + om.writeValueAsString(new A()));
System.out.println("Serialized AA: " + om.writeValueAsString(new AA()));
System.out.println("Serialized B: " + om.writeValueAsString(new B()));
System.out.println("Serialized List of A: " + om.writeValueAsString(Collections.singletonList(new A())));
}
static class A extends Main {
public final String aStr = "World";
public final int aInt = 42;
}
static class AA extends A {
public final String aaStr = "Foo";
}
static class B {
public final String bStr = "Bar";
public final boolean bBool = true;
}
}
如果您遇到麻烦,我们可以在the chat进行讨论,我可以在那里给您更多帮助。
干杯!