Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用反射从POJO获取属性名称和值?_Java_Json_Generics_Reflection - Fatal编程技术网

Java 如何使用反射从POJO获取属性名称和值?

Java 如何使用反射从POJO获取属性名称和值?,java,json,generics,reflection,Java,Json,Generics,Reflection,所以我正在编写一个“POJO到JSON”的转换器。我希望能够传入列表对象并转换为JSON 希望这会有意义 /** * * NOT COMPLETE!!! OBVIOUSLY!!! */ public abstract class Jsonator<T> implements Serializable { private Class<T> entityClass; private JSONObject json; private J

所以我正在编写一个“POJO到JSON”的转换器。我希望能够传入
列表
对象并转换为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 "[]";
    }
}
所以现在,
obj
是一个站点。 好的,然后我尝试获取字段名(firstName,lastName),但是fields对象是空的

我做错了什么

谢谢

编辑

我成功了!这不是完成的代码,但它正在做我现在想要的事情。 我听说谷歌和杰克逊也会这么做。如果有人能提供一个关于如何有选择地从POJO中选择属性的好链接,那么我洗耳恭听

或者更好的是,我想知道为什么我不应该这样做

谢谢

Jsonator(未完成)

示例

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 list.results();
        }
        catch (Exception ex) {
            return list.error();
        } 
    }
}
公共类SiteJsonator扩展了Jsonator{
公共站点JSonator(){
超级(Site.class);
}
}
@控制器
@请求映射(value=“/sites”)
公共类站点控制器{
@自动连线
私人网站服务网站服务;
@RequestMapping(value=“/”,method=RequestMethod.GET,headers=“Accept=application/json”)
@应答器
公共字符串索引(ModelMap){
SiteJsonator列表=新建SiteJsonator();;
试一试{
convert(siteService.getAll());
返回list.results();
}
捕获(例外情况除外){
返回list.error();
} 
}
}
更新2

以下是更好的
Jsonator
,供感兴趣的人参考:

您可以传入一个“exclude”字符串[],它不会包含这些字符串。另外,它有一个标准的“结果、消息等”,我们喜欢在AJAX请求中传回它。适用于ExtJS。

您需要使用来包含私有字段,只列出公共字段


使用
private
字段时,您也会遇到访问限制问题,因此您可能还需要研究该方法。

您可能需要使用kls.getDeclaredFields()而不是kls.getfields()。如果Jason object是你关心的问题,我会向你推荐一个Jackson Codhaus图书馆。在其中,您可以从POJO获取或设置JsonString。。。HTH

你能提供一个真实的例子吗?什么是
站点
对象?你编写这个代码是为了好玩吗?如果没有,那么有很多图书馆(例如)可以为您提供这些服务。旁注:Jsonator是一个很好的名字:-)这不是你问题的真正“答案”,但你可以试试这个:它已经转换了JSON对象。@DuncanJones,我只是为了好玩而编程。:-)但说真的,我们有一个过程,在这个过程中,我们查询数据库并返回一个公共模式。但是对于像
站点
这样的对象,可能有20个属性。但是,我们并不总是希望显示所有20个。一个用例可能只需要2个。另一个可能需要15个。等等。哦,是的,Jsonator突然出现在我的脑海里。lol@DavidGrant提供了一个真实的例子,很好地抓住了keppil。一旦field.accessible设置为true,就可以访问私有变量……我将anser授予@Keppil,因为getDeclaredFields和setAccessible允许我做我需要的事情。谢谢大家。对了,我看着杰克逊。但就我的一生而言,我找不到一个简单易学的教程来做我想做的事情。如果您有链接,将不胜感激。我回到SimpleJSON,因为它很简单。:-)这是我找到的简单教程。谢谢,但我也找到了那个教程。它没有告诉我的是我如何有选择地选择要输出的属性。我想我现在必须承认你的解决方案,但我仍然记得我们可以使用Jackson库从映射中获取json字符串。您仍然说了选择性属性,所以我想您只需要从pojo obj获取Json。我可能也可以用反射来做同样的事情。
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 list.results();
        }
        catch (Exception ex) {
            return list.error();
        } 
    }
}