java反射生成json如何去掉自带属性

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java反射生成json如何去掉自带属性相关的知识,希望对你有一定的参考价值。

代码如下:
StringBuilder builder = new StringBuilder()
builder.append("")
Class cla = Class.forName(obj.getClass().getName());
Field[] fields = cla.getDeclaredFields();
String separate="";
for(Field field : fields)
field.setAccessible(true);
builder.append(separate);
builder.append("\"");
builder.append(field.getName());
builder.append("\":");
builder.append("\"");
builder.append(field.get(obj));
builder.append("\"");
separate=",";

builder.append("");
return builder.toString();

每次生成的JSON都会显示下面这些
"instanceControllersDomainBindingApi":"org.codehaus.groovy.grails.plugins.web.api.ControllersDomainBindingApi@431a3fe1","instanceGormValidationApi":"org.codehaus.groovy.grails.orm.hibernate.HibernateGormValidationApi@7057ef31"

求大神解答 如何只显示自己的字段,不要java自带的那些class什么的

参考技术A org.codehaus.groovy.grails.plugins.web.api.ControllersDomainBindingApi@431a3fe1
这样的现实无非就是ControllersDomainBindingApi 这个类没有重写toString方法 ,才出现这样的情况
参考技术B java自带的那些class 这个应该怎么理解?

org.codehaus.groovy.grails.plugins.web.api.ControllersDomainBindingApi@431a3fe1
这样的现实无非就是ControllersDomainBindingApi 这个类没有重写toString方法 ,才出现这样的情况追问

好吧,其实这个是grails的,但是我想写法应该和java一样吧。
现在问题是:比如说我的类只有 long id; String title; String url; String icon;
我反射成的JSON只要这4个, 不要其他的,比如 instanceDatabindingApi,$staticClassInfo 等

追答//创建一个可以纳入json的列表
List<String> allowFieldNames = new ArrayList<String>();
        allowFieldNames.add("id");
        allowFieldNames.add("title");
        allowFieldNames.add("url");
        allowFieldNames.add("icon");
        for(Field field : fields)
        //如果该属性名称不在列表中,遍历下一个
            if(! allowFieldNames.contains(field.getName()))
                continue;
            
            field.setAccessible(true);
            builder.append(separate);
            builder.append("\\"");
            builder.append(field.getName());
            builder.append("\\":");
            builder.append("\\"");
            builder.append(field.get(obj));
            builder.append("\\"");
            separate=",";
        
        builder.append("");

本回答被提问者采纳

java中如何通过反射获取类的属性

简单的方法如下:
Class<?> cls=Class.forName(className);////////////////////////通过类的名称反射类
Object obj=cls.newInstance();//////////////////////对象实例化
Field field=cls.getField(fieldName);/////这个对应的是属性
fieldValue=field.get(obj);////这个就是属性的值
参考技术A //得到该类的属性集合 model为对象
Field[] fields=model.getClass().getDeclaredFields();
//遍历
for(Field field:fields)
field.setAccessible(true);
//获取一个属性
String name = field.getName();
//获取该属性的值,可能为空
Object value = field.get(am);
参考技术B import java.lang.reflect.Field;
public class Test
public String p;
public static void main(String[] args)
try
Class a=Class.forName("Test");
Field f=a.getField("p");
Test s=new Test();
f.set(s, "2323");
System.out.println(s.p);// 调用属性
catch (ClassNotFoundException e)
e.printStackTrace();
catch (SecurityException e)
e.printStackTrace();
catch (IllegalArgumentException e)
e.printStackTrace();
catch (IllegalAccessException e)
e.printStackTrace();
catch (NoSuchFieldException e)
e.printStackTrace();


参考技术C public Field[] getFields();

以上是关于java反射生成json如何去掉自带属性的主要内容,如果未能解决你的问题,请参考以下文章

java反射机制

使用Gson的Java反射和递归JSON反序列化程序

利用Java反射实现JavaBean对象相同属性复制并初始化目标对象为空的属性的BeanUtils

Java反序列化漏洞——反射与反序列化基础

如何用java递归生成带children的json串

java反射机制动态获取hibernate懒加载对象