所以我正在写一个“ POJO to JSON”转换器。我希望能够传递一个List<T>
对象并转换为JSON。
希望这会有意义
/**
*
* NOT COMPLETE!!! OBVIOUSLY!!!
*/
public abstract class Jsonator<T> implements Serializable {
private Class<T> entityClass;
private JSONObject json;
private JSONArray jsonArray;
public Jsonator(Class<T> entityClass) {
this.entityClass = entityClass;
}
public void convert(List<T> paObjectList) throws IllegalArgumentException, IllegalAccessException {
json = new JSONObject();
jsonArray = new JSONArray();
try {
for (Object obj : paObjectList) {
JSONObject objJson = new JSONObject();
Class<?> kls = obj.getClass();
Field[] fields = kls.getFields();
for (Field field : fields) {
objJson.put(field.getName(), (T) field.get(obj));
}
jsonArray.add(objJson);
}
json.put("results", jsonArray);
}
catch (Exception ex) {
}
}
public String error() {
return "ERROR";
}
public String results() {
if (json != null) {
return json.toJSONString();
}
return "[]";
}
}
当我进入本Object obj
节时,我obj
是正确的。我可以调试它,并查看类的名称和值。
假设该类是这样的:
public class User {
private firstName;
private lastName;
... getters....setters....etc...
}
所以现在obj
是一个站点。OK,然后我尝试获取字段名称(firstName,lastName),但是fields对象为空。
我究竟做错了什么?
谢谢
编辑
我知道了!这不是完成的代码,但它确实正在执行我现在想要的操作。我读过Google和Jackson也会这样做。如果有人可以提供一个很好的链接,说明如何有选择地从POJO中选择属性,那么我无所不能。
还是更好,我想知道 为什么 我不应该这样吗?
谢谢!
Jsonator(未完成)
import java.io.Serializable;
import java.lang.reflect.Field;
import java.util.List;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
/**
*
* @author Cecil.Meeks
*/
public abstract class Jsonator<T> implements Serializable {
private Class<T> entityClass;
private JSONObject json;
private JSONArray jsonArray;
public Jsonator(Class<T> entityClass) {
this.entityClass = entityClass;
}
public void convert(List<T> paObjectList) throws IllegalArgumentException, IllegalAccessException {
json = new JSONObject();
jsonArray = new JSONArray();
try {
for (Object obj : paObjectList) {
JSONObject objJson = new JSONObject();
Class<?> kls = obj.getClass();
Field[] fields = kls.getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
objJson.put(field.getName(), field.get(obj));
}
jsonArray.add(objJson);
}
json.put("results", jsonArray);
}
catch (SecurityException ex) {
ex.printStackTrace();
}
catch (Exception ex) {
ex.printStackTrace();
}
}
public String error() {
return "ERROR";
}
public String results() {
if (json != null) {
return json.toJSONString();
}
return "[]";
}
}
网站类别
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import org.hibernate.annotations.GenericGenerator;
@Entity
@Table(name = "Sites")
public class Site implements Serializable {
private String siteKey;
private String site;
private String siteType;
private String address1;
private String address2;
private String city;
private String zipCode;
private String createdBy;
private String glCode;
public Site() {
}
@Id
@GenericGenerator(name = "generator", strategy = "guid", parameters = {})
@GeneratedValue(generator = "generator")
public String getSiteKey() {
return siteKey;
}
public void setSiteKey(String siteKey) {
this.siteKey = siteKey;
}
@Column(name = "Site", unique = true, length = 125, nullable = false)
public String getSite() {
return site;
}
public void setSite(String site) {
this.site = site;
}
@Column(name = "SiteType", unique = false, length = 8, nullable = true)
public String getSiteType() {
return siteType;
}
public void setSiteType(String siteType) {
this.siteType = siteType;
}
@Column(name = "Address1", unique = false, length = 125, nullable = true)
public String getAddress1() {
return address1;
}
public void setAddress1(String address1) {
this.address1 = address1;
}
@Column(name = "Address2", unique = false, length = 125, nullable = true)
public String getAddress2() {
return address2;
}
public void setAddress2(String address2) {
this.address2 = address2;
}
@Column(name = "City", unique = false, length = 125, nullable = true)
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
@Column(name = "ZipCode", unique = false, length = 50, nullable = true)
public String getZipCode() {
return zipCode;
}
public void setZipCode(String zipCode) {
this.zipCode = zipCode;
}
@Column(name = "CreatedBy", unique = false, length = 125, nullable = true)
public String getCreatedBy() {
return createdBy;
}
public void setCreatedBy(String createdBy) {
this.createdBy = createdBy;
}
@Column(name = "GLCode", unique = false, length = 11, nullable = true)
public String getGlCode() {
return glCode;
}
public void setGlCode(String glCode) {
this.glCode = glCode;
}
}
例
public class SiteJsonator extends Jsonator<Site> {
public SiteJsonator() {
super(Site.class);
}
}
@Controller
@RequestMapping(value = "/sites")
public class SitesController {
@Autowired
private SiteService siteService;
@RequestMapping(value = "/", method = RequestMethod.GET, headers = "Accept=application/json")
@ResponseBody
public String index(ModelMap map) {
SiteJsonator list = new SiteJsonator();;
try {
list.convert(siteService.getAll());
return html" target="_blank">list.results();
}
catch (Exception ex) {
return list.error();
}
}
}
更新2
Jsonator
对于那些有兴趣的人来说,这是更好的选择:
https://gist.github.com/3893242
您可以传递“ exclude” String
[],并且其中不包括那些。另外,它具有标准的“结果,消息等”,我们希望将其传递回我们的AJAX请求中。对ExtJS有好处。
您需要使用#getDeclaredFields()
包括私有字段,#getFields()
仅列出公共字段。
使用private
字段,您还将遇到访问限制问题,因此您可能也想研究该Field#setAccessible()
方法。
问题内容: 我知道如果知道注释类,就可以轻松获取特定注释并访问其属性。例如: 它将返回特定注释接口的引用,因此您可以轻松访问其值。 我的问题是,我是否对特定的注释类不了解。我只想使用反射在运行时获取所有注释类名称及其属性,以将类信息转储为例如JSON文件的目的。我该如何轻松地做到这一点。 此方法将仅返回注释接口的动态代理。 问题答案: 与预期的相反,注释的元素不是属性-它们实际上是返回提供的值或默
我知道如果我们知道注释类,我们可以很容易地获得特定的注释并访问其属性。例如: 它将返回特定注释接口的引用,因此您可以轻松访问其值。 我的问题是,我是否对特定的注释类没有预先了解。我只想在运行时使用反射来获取所有注释类名及其属性,以便将类信息转储为例如JSON文件。我怎样才能以简单的方式做到这一点。 此方法将仅返回注释接口的动态代理。
问题内容: 我正在尝试使用Go的反射系统来检索函数的名称,但是在调用其类型的Name方法时会得到一个空字符串。这是预期的行为吗? 这是我如何解决问题的简单示例: 问题答案: 解决方案是使用FuncForPc返回一个。 返回: 如果需要,只需将其标记化即可。
我使用的是selenium pagefactory,并引入了一个注释@Name(Description=“Username”),用于所有WebElement。稍后,我需要在自定义方法中找到描述值,以便进行报告,例如: 我的@Name注释界面和pagefactory如下所示: 名称接口 在使用反射时,我面临的问题是需要定义pagefactory的类名,并提供字段名作为字符串“username”,以检
使用Java反射,是否可以获取局部变量的名称?例如,如果我有: 有没有可能实现一种方法,可以找到这些变量的名称,比如: 编辑:这个问题与Java中有没有找到传递给函数的变量名称的方法不同?在这一点上,它更纯粹地询问一个人是否可以使用反射来确定局部变量的名称,而另一个问题(包括公认的答案)更侧重于测试变量的值。
我有一节课: 值是唯一的,如何通过其值获取属性的名称? 通过反射,例如: