[Okta Webinar] Learn how to a build a cloud-first strategyRegister Now

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 1852
  • Last Modified:

Java, JSON and reflection

Hy all

I playing a little with Java and Reflection.

So the Idea is to transform a Java object in a JSON object.

For now seems that works if I have a class just with public fields. But if I have package fields, they aren't collectable like this. How to get them?

Note: I will say thanks if you get me a Lib doing this, but I prefer to do it myself.


package oleber.json.simple;
 
import java.lang.reflect.Field;
import java.util.Collection;
import java.util.Map;
 
public class JSONable implements IJSONable {
 
	@Override
	public JSONObject toJSON() {
		try {
			JSONObject objJSON = new JSONObject();
			JSONObject objValues = new JSONObject();
			JSONObject objTypes = new JSONObject();
 
			objJSON.put("values", objValues);
			objJSON.put("types", objTypes);
 
			for ( Field field : getClass().getFields() ) {
				if ( field.getType() == byte.class ) {
					objValues.put(field.getName(), field.getByte(this));
				} else if ( field.getType() == char.class ) {
					objValues.put(field.getName(), field.getChar(this));
				} else if ( field.getType() == short.class ) {
					objValues.put(field.getName(), field.getShort(this));
				} else if ( field.getType() == int.class ) {
					objValues.put(field.getName(), field.getInt(this));
				} else if ( field.getType() == long.class ) {
					objValues.put(field.getName(), field.getLong(this));
				} else if ( field.getType() == float.class ) {
					objValues.put(field.getName(), field.getFloat(this));
				} else if ( field.getType() == double.class ) {
					objValues.put(field.getName(), field.getDouble(this));
				} else if ( field.getType() == boolean.class ) {
					objValues.put(field.getName(), field.getBoolean(this));
				} else if ( field.getType() == String.class ) {
					objValues.put(field.getName(), field.get(this));
				} else {
					Object value = field.get(this);
					if ( value == null ) {
						objValues.put(field.getName(), null);
					} else if ( value instanceof String || value instanceof IJSONable) {
						objValues.put(field.getName(), value);
						objTypes.put(field.getName(), value.getClass().toString());
					} else if ( value instanceof Collection ) {
						JSONArray array = new JSONArray( ( Collection<?> ) value );
						objValues.put(field.getName(), array);
						objTypes.put(field.getName(), value.getClass().toString());
					} else if ( value instanceof Map ) {
						JSONObject object = new JSONObject( ( Map<String,?> ) value );
						objValues.put(field.getName(), object);
						objTypes.put(field.getName(), value.getClass().toString());
					}
				}
			}
			return objJSON;
		} catch ( Exception e ) {
			e.printStackTrace();
			return null;
		}
	}
 
	@Override
	public JSONable toJSON(JSONObject obj) {
		return null;
	}
 
	@Override
	public String toString() {
		return toJSON().toString();
	}
}

Open in new window

0
oleber
Asked:
oleber
  • 5
  • 2
1 Solution
 
manuel_mCommented:
Try the following. This will return an array of all fields of the class, including package, private, protected and public fields.
for ( Field field : getClass().getDeclaredFields() ) {

Open in new window

0
 
manuel_mCommented:
hmm. ignore it. with this code snippet you get the fields but you can't access them from another package.
With field.isAccessible() you can check the accessibility of the field. If this field has default access only, you will get an error:
java.lang.IllegalAccessException: Class reflectiontest.Main can not access a member of class com.xxx.test.Test with modifiers ""
        at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:65)
0
 
oleberAuthor Commented:
that is my problem ;)


But you serialize a class, Where is the secret?
0
Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
manuel_mCommented:
Do you know the structure of the classes?

Can't you access the package variables from the get methods?
0
 
oleberAuthor Commented:
I'm trying to do this generic. Basically every child class from this would be able of convert itself to JSON.
0
 
manuel_mCommented:
0
 
manuel_mCommented:
0

Featured Post

New feature and membership benefit!

New feature! Upgrade and increase expert visibility of your issues with Priority Questions.

  • 5
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now