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.
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. lolExemple réel fourni.
OriginalL'auteur cbmeeks | 2012-10-11
Vous devez vous connecter pour publier un commentaire.
Vous devez utiliser
#getDeclaredFields()
pour inclure les champs privés,#getFields()
répertorie uniquement les publics.Avec
private
champs vous pourrez également lancer dans la restriction d'accès des problèmes, alors vous voudrez probablement regarder dans le#Champ setAccessible()
méthode.- Ce vraiment m'a orienté dans la bonne direction. Merci
Je suis d'attribution de la anser à @Keppil parce qu'il était à la fois le getDeclaredFields et setAccessible qui m'a permis de faire ce dont j'ai besoin. Merci à tous.
OriginalL'auteur Keppil
Au lieu de kls.getfields vous pourriez avoir besoin d'utiliser kls.getDeclaredFields() . Et si Jason objet est votre préoccupation que j'ai eu vous recommander un Jackson Codhaus de la bibliothèque . Dans lequel vous pouvez obtenir ou définir JsonString de votre POJO... HTH
Voici le tutoriel que j'ai trouvé . HTH mkyong.com/java/how-to-convert-java-object-to-from-json-jackson
Merci, mais j'ai trouvé le tutoriel. Ce qu'il ne veut pas me dire, c'est comment puis-je choisir de façon sélective des propriétés à la sortie.
Eh bien, je suppose que je dois l'avouer à votre solution à ce point, mais encore je me souviens que nous pouvons obtenir de chaîne json à partir de la carte à l'aide de Jackson lib. Encore vous dit sélectif de la propriété, donc je suppose que vous avez besoin pour obtenir Json de votre pojo obj. Je pourrais probablement faire la même chose en utilisant la réflexion.
OriginalL'auteur iDroid