我有一个用例,我必须在Java中将JSON解析为原始值。我在JSON中嵌入了指导性字段,通知我解析要反序列化的原语。必须将这些基元类型添加到某个长度的数组中。
所以我可能会有这样的JSON:
"primitives" : [
{
"valueType" : "int",
"value" : 3
},
{
"valueType" : "double",
"value" : 4
},
]
我已经编写了代码来正确地将这个JSON解析为两个原语,一个是int,双重的是值为3和4.但是,因为我将它们添加到一个期望对象的ArrayList,它们被自动装入Java的Integer和Double类型。我想过使用常规的Java数组,但是仍然存在指定类似Object[] arr
的元素类型的问题,我有同样的问题,或int[]
我太具体了。
Java中是否有一些功能可以让我将这个JSON解析为正确的基元数组。
我考虑过的一个解决方案是将所有不同的基元作为属性的对象,但如果语言级路径可用,这似乎太复杂了。
答案 0 :(得分:2)
假设保持原始排序(因此是单个数组)很重要,并且跟踪类型很重要,并且使用JSON解析器不可用,我会考虑以下内容。
enum ValueType { INT, DOUBLE, FLOAT };
static abstract class ParsedValue<T>
{
private final T data;
private final ValueType type;
public ParsedValue(T val, ValueType t)
{
data = val;
type = t;
}
public ValueType getType()
{
return type;
}
public T getValue()
{
return data;
}
}
static class IntParsedValue extends ParsedValue<Integer>
{
public IntParsedValue(Integer val)
{
super(val, ValueType.INT);
}
}
static class DoubleParsedValue extends ParsedValue<Double>
{
public DoubleParsedValue(Double val)
{
super(val, ValueType.DOUBLE);
}
}
public static void main(String[] args)
{
List<ParsedValue<?>> lst = new ArrayList<>();
Random rnd = new Random();
for (int i = 0; i < 25; ++i) {
ParsedValue<?> pv;
if (rnd.nextInt(2) == 0) {
pv = new IntParsedValue(rnd.nextInt(500));
}
else {
pv = new DoubleParsedValue(rnd.nextDouble());
}
lst.add(pv);
}
for (ParsedValue<?> pv : lst) {
switch (pv.getType()) {
case INT:
System.out.println("Integer: " + pv.getValue());
break;
case DOUBLE:
System.out.println("Double: " + pv.getValue());
break;
case FLOAT:
//...
break;
}
}
}