Как можно использовать отражение, чтобы получить имена свойств и значения из POJO?

Поэтому я пишу конвертер "POJO в 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 это сайт. Хорошо, я тогда пытаюсь получить имена полей (firstName, lastName), но объект полей пуст.

Что я делаю неправильно?

Спасибо

РЕДАКТИРОВАТЬ

Я получил это на работу! Это не законченный код, но он делает именно то, что я хочу сейчас. Я читал, что Google и Джексон тоже это сделают. Если кто-то может предоставить хорошую ссылку о том, как выборочно выбрать свойства из 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 list.results();
        }
        catch (Exception ex) {
            return list.error();
        } 
    }
}

ОБНОВЛЕНИЕ 2

Вот лучшеJsonator для заинтересованных:

https://gist.github.com/3893242

Вы можете передать строку «exclude» [], и она не будет включать их. Кроме того, у него есть стандартные «результаты, сообщения и т. Д.», Которые мы хотели бы передавать в наших AJAX-запросах. Хорошо для ExtJS.

 David Grant11 окт. 2012 г., 22:31
Можете ли вы предоставитьреальный пример? Что этоSite объект?
 dispake11 окт. 2012 г., 22:49
Это не настоящий «ответ» на ваш вопрос, но вы можете попробовать это:code.google.com/p/google-gson который уже преобразует объекты JSON <->.
 Duncan Jones11 окт. 2012 г., 22:35
Вы кодируете это для удовольствия? Если нет, есть много библиотек (например,Google-gson), который может сделать это для вас. Примечание:Jsonator отличное имя :-)
 cbmeeks12 окт. 2012 г., 14:02
@DuncanJones ну я программирую только для удовольствия. :-) А если серьезно, у нас есть процедура, где мы запрашиваем БД и возвращаем общий шаблон. Но для такого объекта, какSite, может быть 20 свойства. Тем не менее, мы не всегда хотим отображать все 20. Один вариант использования может потребоваться только 2. Другой может потребоваться 15. И т. Д. Да, и да, Jsonator только что заглянул мне в голову. лол
 cbmeeks12 окт. 2012 г., 14:21
@DavidGrant Реальный пример предоставлен.

Ответы на вопрос(2)

И если вы беспокоитесь о Джейсоне, я бы порекомендовал вам библиотеку Джексона Кодхауса. В котором вы можете получить или установить JsonString из вашего POJO ... HTH

 cbmeeks12 окт. 2012 г., 20:17
Спасибо, но я нашел этот урок тоже. То, что он не говорит мне, как я выборочно выбираю свойства для вывода.
 iDroid12 окт. 2012 г., 20:08
Вот простое руководство, которое я нашел. НТНmkyong.com/java/how-to-convert-java-object-to-from-json-jackson
 iDroid12 окт. 2012 г., 20:42
Ну, я думаю, что должен признать ваше решение на данный момент, но все же я помню, что мы можем получить строку json из карты, используя Jackson lib. Тем не менее, вы указали выборочное свойство, поэтому я думаю, вам нужно получить Json только из вашего pojo obj. Я мог бы сделать то же самое, используя отражение.
 cbmeeks12 окт. 2012 г., 13:42
Правильно, я посмотрел на Джексона. Но для жизни я не могу найти простой учебник, который делает то, что я пытаюсь сделать. Если у вас есть ссылки, это будет оценено. Я вернулся к SimpleJSON, потому что все было просто. :-)
Решение Вопроса

#getDeclaredFields() включить частные поля,#getFields() только списки общедоступных.

С участиемprivate поля, которые вы также столкнетесь с проблемами ограничения доступа, так что вы, вероятно, хотите посмотреть вField#setAccessible() метод также.

 cbmeeks12 окт. 2012 г., 20:18
Я присуждаю ансер @Keppil, потому что именно getDeclaredFields и setAccessible позволили мне сделать то, что мне нужно. Всем спасибо.
 iDroid11 окт. 2012 г., 22:48
Хороший улов кеппил. Доступ к закрытым переменным можно получить, если field.accessible установит значение true ....
 cbmeeks12 окт. 2012 г., 14:21
Это действительно указало мне в правильном направлении. Спасибо

Ваш ответ на вопрос