Comment pouvez utiliser la réflexion pour obtenir les noms des propriétés et des valeurs à partir d'un POJO?

Donc je suis en train d'écrire un "POJO en JSON" convertisseur. Je veux être en mesure de passer à une List<T> objet et de le convertir en JSON.

Espérons que cela a du sens,

/**
 *
     * 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 "[]";
    }
}

Quand j'arrive à la Object obj section, mon obj est correct. Je peux le débogage et de voir le nom et la valeur de la classe.

Disons que la classe est: est-ce

public class User {
    private firstName;
    private lastName;

    ... getters....setters....etc...

}

De sorte que maintenant, obj est un Site.
OK, j'ai ensuite essayer d'obtenir les noms de champs (prénom, nom), mais les champs de l'objet est vide.

Ce que je fais mal?

Grâce

MODIFIER

Je l'ai eu à travailler!!! Ce n'est pas fini de code, mais il fait exactement ce que je veux pour l'instant.
J'ai lu que Google et Jackson vont le faire aussi. Si quelqu'un peut donner un bon lien sur la façon de manière sélective de sélection de propriétés à partir d'un POJO, alors je suis tout oreilles.

Ou, mieux encore, je voudrais savoir POURQUOI je ne devrais pas faire cela, de cette façon?

Merci!

Jsonator (PAS FINI)

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 "[]";
}
}

Site De Classe

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;
}
}

EXEMPLE

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();
} 
}
}

Mise à JOUR 2

Ici est la meilleure Jsonator pour ceux qui sont intéressés:

https://gist.github.com/3893242

Vous pouvez passer d'un "exclure" String[] et elle ne comprendra pas. De Plus, il a une norme "des résultats, message, etc" que nous aimons passer nos requêtes AJAX. Bon pour ExtJS.

Pouvez-vous fournir un réel exemple? Qu'est-ce que le Site objet?
Êtes-vous ce codage pour le plaisir? Si non, il y a beaucoup de bibliothèques (par exemple, google-gson) qui peuvent le faire pour vous. Note de côté: Jsonator est un super nom 🙂
Ce n'est pas une vraie réponse à votre question, mais vous pourriez peut-être essayer ceci: code.google.com/p/google-gson qui a déjà convertit JSON <-> Objets.
eh bien, je programme uniquement pour le plaisir. 🙂 Mais plus sérieusement, nous avons une procédure où nous requête de la base de données et le retour d'un modèle commun. Mais pour un objet comme Site, il y a peut être 20 propriétés. Cependant, nous n'avons pas toujours envie d'afficher toutes les 20. Un cas d'utilisation peut seulement besoin de 2. Un autre pourrait avoir besoin de 15. Etc. Oh, et oui, les Jsonator juste sauté dans ma tête. lol
Exemple réel fourni.

OriginalL'auteur cbmeeks | 2012-10-11