我目前正在使用Java编写JSON解析器,但是我无法确定应该使用哪种策略来执行此任务。请注意,对此的答案将影响我未来的策略,因此请尽量使您的方法尽可能通用;这只是一个例子。
首先我们需要解析器,但后来我想到了以下内容:为什么不为JSON创建enum
- array
和JSON - objects
?最终代码将更加面向对象,如果JSON中的新类型出现(可能永远不会发生),则必须编写更少的代码。所以我的enum
看起来像这样:
public enum Brackets {
Object( '{', '}', JSONObject.class),
Array( '[', ']', JSONArray.class);
public final char startChar;
public final char endChar;
public final Class<?> correspondingClass;
private Brackets(char start, char end, Class<?> corresponding) {
startChar = start;
endChar = end;
correspondingClass = corresponding;
}
}
通过标准的枚举方法,人们可以基本上迭代实际的枚举,并在适当的情况下采取适当的行动。
回到'新的JSON类型',它是虚构的。让我们说X人说,让我们添加代表Y的'(',')'对象。我想要一些你可以轻松添加的东西而不会有麻烦,这个枚举我只需要添加一个新的枚举:
Y( '(', ')', JSONY.class)
对我来说,如果你只是使用这两个对象,它看起来真的很硬(所以它看起来像:
public class Parser {
// ......
public Object getJSON(String t) {
if(/* .... */) {
return new JSONObject(t);
} else f ( /* .... */ ) {
return new JSONArray(t);
}
return null;
}
// ......
}
当然构造函数会有所不同和东西,但这不是pont),如果你通过反射来实现它只是基于枚举而算法应该为你做剩下的事情(所以这看起来像:
public class Parser {
//....
public Object getJSON(String t) {
for(Brackets b : Brackets.values()) {
if( /* .... */ ) {
return b.correspondingClass.getConstructor(String.class).newInstance(t);
}
}
return null;
}
}
)。
那么,如果您知道只有这两个对象可用,或者通过反射进行硬编码,并且如果出现新的所谓“JSON类型”,那么硬编码是一种更好的做法吗?
我想强调的是,这不是关于如何正确解析它的算法,而是更多关于什么是更好的解决方法。