我试图将Java类作为参数传递给函数,其背后的原因是我有几个针对不同API的pojo类,我试图为所有API URL和pojo类创建一个解析器实用程序,我试过了很少或没有成功。
下面是代码示例 -
public class util {
public static void main(String[] args) throws JsonParseException, JsonMappingException, IOException {
List<JsonGenMovies> jsongen = null;
String url = "http://www.dishanywhere.com/radish/v20/dol/movies/carousels/featured.json?nkey=0e1345ee597cf280c8a2cde367b6b894";
getMovieParser(jsongen, url);
List<JsonGenShow> jsongenShow = null;
String URL = "http://www.dishanywhere.com/radish/v20/dol/shows/carousels/featured.json";
getShowParser(jsongenShow, URL);
}
public static String[] getMovieParser (List<JsonGenMovies> jsongen, String url ) throws JsonParseException, JsonMappingException, IOException
{
URL jsonUrl = new URL(url);
ObjectMapper objmapper = new ObjectMapper();
jsongen = objmapper.readValue(jsonUrl, new TypeReference<List<JsonGenMovies>>() {});
String[] shows = new String [jsongen.size()];
int i = 0;
for(JsonGenMovies element : jsongen) {
shows[i++]=element.getName();
}
for(int j =0; j<shows.length;j++)
{
System.out.println(shows[j]);
}
return shows;
}
public static String[] getShowParser (List<JsonGen> jsongenShow, String URL ) throws JsonParseException, JsonMappingException, IOException
{
URL jsonUrl = new URL(URL);
ObjectMapper objmapper = new ObjectMapper();
jsongenShow = objmapper.readValue(jsonUrl, new TypeReference<List<JsonGen>>() {});
String[] shows = new String [jsongenShow.size()];
int i = 0;
for(JsonGen element : jsongenShow) {
shows[i++]=element.getName();
}
for(int j =0; j<shows.length;j++)
{
System.out.println(shows[j]);
}
return shows;
}
}
在行 -
jsongen = objmapper.readValue(jsonUrl, new TypeReference<List<JsonGen>>() {});
我仍然有<List<JsonGen>>
一个硬编码的类名,我试图用参数替换它。如果你能提供帮助,请。
请回答一点解释,一个班轮可能不是我的事。
此致 石
答案 0 :(得分:2)
如果我理解正确你想要一个功能而不是两个或更多功能
您可以使用generic type
E.g
public static <T> String[] getParser(List<T> jsongen, String url) throws JsonParseException, JsonMappingException, IOException {
URL jsonUrl = new URL(url);
ObjectMapper objmapper = new ObjectMapper();
jsongen = objmapper.readValue(jsonUrl, new TypeReference<List<T>>() {
});
String[] shows = new String[jsongen.size()];
int i = 0;
for (T element : jsongen) {
shows[i++] = element.getName();
}
for (int j = 0; j < shows.length; j++) {
System.out.println(shows[j]);
}
return shows;
}
如果JsonGenMovies
和JsonGen
都扩展/实现了一个界面或类,请注意JsonGenMovies extends Json
,然后您就可以执行此操作:
public static <T extends Json> String[] getParser(List<T> jsongen, String url)
T
是一个泛型类型,它实际上并不存在,但它将在运行时被用于jsongen
arg的类替换。
例如:
List<String> myList;
getParser(myList, "http://blablabla.blalb.com");
所有T
都被String
替换。
我希望这就是你要找的东西 您可以找到有关泛型类型here的更多解释,并提供比我更好的解释。
编辑:
如果你想保留你的POJO模式,那么你可以尝试这个(不确定它是否可行)
public static String[] getParser(List<?> jsongen, String url) throws Exception {
URL jsonUrl = new URL(url);
ObjectMapper objmapper = new ObjectMapper();
jsongen = objmapper.readValue(jsonUrl, new TypeReference<List<?>>() {
});
String[] shows = new String[jsongen.size()];
int i = 0;
for (Object element : jsongen) {
Method method = element.getClass().getMethod("getName");
shows[i++] = (String) method.invoke(element);
}
for (int j = 0; j < shows.length; j++) {
System.out.println(shows[j]);
}
return shows;
}