android Model对象转换方法,两个实体类对象赋值简便方法

在android 应用开发中,经常是要处理服务接口返回的数据的,因此会将服务器数据(一般为json)转换为Model对象模型,但是有时候会有把一个model的属性值赋值给另一个model属性值的情况,例如一个模块或者方法只要求你传一种对象,其它类型的对象我不要(单一模式),但是你的数据不是要传对象的类型,两个model不是同一个对象类型,但是大多数属性名相同,如属性id等。所以就要有赋值转换了,如下,你是否这样的代码:

model类

class Person{
   public String name;
   public int age;
   public ...
}
class Person1{
   public String name;
   public int age;
   public ...
}
Person person=new Person();
person.name="aa";
person.age=10;

//给person1赋值
Person1 person1=new Person1();
person1.name=person.name;
person1.age=person.age;
...
怎么样,当有很多属性需要这样赋值的时候,你就会有一大堆的
person1.age=person.age;
很明显这是不优雅的写法的,看起来也不舒服,当然会有人说为什么不用继承方法,把相同属性放到父model里,这样也可以,不过不方便扩展,也比较复杂,一般服务器数据model类是不应该继承其他类(除Object),嗯,问题说完了,那应该怎么写比较好呢。那就是反射,获取对象A的属性,把值赋给对象B相同的属性名,如name-->name,嗯嗯。。原理就是这样,后来我又想到这种方法的话现有的就有这样方法呀!那就是Gson,gson大家应该都用过,反正我是用这个来解析服务器数据的,非常简单方便,方法如下:

/**
 * 把modelA对象的属性值赋值给bClass对象的属性。
 * @param modelA
 * @param bClass
 * @param <T>
    * @return
    */
   
public static <A, B> B modelA2B(A modelA, Class<B> bClass) {
    try {
        Gson gson = new Gson();
        String gsonA = gson.toJson(modelA);
        B instanceB = gson.fromJson(gsonA, bClass);

        Log.d(TAG, "modelA2B A=" + modelA.getClass() + " B=" + bClass + " 转换后=" + instanceB);
        return instanceB;
    } catch (Exception e) {
        Log.e(TAG, "modelA2B Exception=" + modelA.getClass() + " " + bClass + " " + e.getMessage());
        return null;
    }
}

方法很简单,可以写在Utils类静态方法,方便调用,意思就是把modelA,(A可以是任意object类型)的所有属性值转换为json字符串,再把json字符串转换为Class为bClass的对象,如果对泛型不太熟的话,写成这样也是可以的:

public static <B> B modelA2B(Object modelA, Class<B> bClass) {
    try {
        Gson gson = new Gson();
        String gsonA = gson.toJson(modelA);
        B instanceB = gson.fromJson(gsonA, bClass);

        Log.d(TAG, "modelA2B A=" + modelA.getClass() + " B=" + bClass + " 转换后=" + instanceB);
        return instanceB;
    } catch (Exception e) {
        Log.e(TAG, "modelA2B Exception=" + modelA.getClass() + " " + bClass + " " + e.getMessage());
        return null;
    }
}

并返回对象B,就是一个加解析的过程,用法如下:

Person person=new Person();
person.name="aa";
person.age=10;
Person1 person1=Util.modelA2B(person,Person1.class);
用法也很简单,传个对象和转换后对象Class就可以了,会把person的相同属性赋值给person1对象,还有如果属性名不同的不会报错,放心使用

class Person{
   public String name;
   public int age;
   public String number;
   public String phone;
}
class Person1{
   public String name;
   public long age;
   public int number;
   public String phone1;
}
age 的属性名相同,类型不同,但还是可以赋值的,number如果是数字字符串的话“101”也是可以给Person1的number的,这都要归于Gson的强大之处呀!如果属性名不同的话,那就没办法了,只能转换好之后手动赋值了,然后性能问题的话,这个不考虑,为了方便,和基本的也没什么区别

person.phone="110";
Person1 person1=Util.modelA2B(person,Person1.class);
person1.phone1=person.phone;
这个自己赋值吧,这种情况不多……

有什么不好的地方或疑问还请大家留言回复!谢谢了……


  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在Spring Boot中,你可以使用BeanUtils类或ModelMapper库来实现实体对象到另一个动态对象赋值。 1. 使用BeanUtils类: 首先,确保你的实体类和目标动态对象类具有相同的字段名和类型。然后,可以使用以下代码将实体对象属性复制到目标动态对象: ```java import org.springframework.beans.BeanUtils; public class EntityToDynamicObjectConverter { public static void convert(Object sourceEntity, Object targetDynamicObject) { BeanUtils.copyProperties(sourceEntity, targetDynamicObject); } } ``` 在调用时,你可以传入源实体对象和目标动态对象进行赋值: ```java YourEntity sourceEntity = new YourEntity(); // 设置源实体对象属性 YourDynamicObject targetDynamicObject = new YourDynamicObject(); EntityToDynamicObjectConverter.convert(sourceEntity, targetDynamicObject); ``` 2. 使用ModelMapper库: 首先,确保你已经在项目中添加了ModelMapper的依赖。然后,你需要创建一个ModelMapper对象,并使用其map()方法实体对象属性映射到目标动态对象: ```java import org.modelmapper.ModelMapper; public class EntityToDynamicObjectConverter { private static ModelMapper modelMapper = new ModelMapper(); public static void convert(Object sourceEntity, Object targetDynamicObject) { modelMapper.map(sourceEntity, targetDynamicObject); } } ``` 在调用时,你可以传入源实体对象和目标动态对象进行赋值: ```java YourEntity sourceEntity = new YourEntity(); // 设置源实体对象属性 YourDynamicObject targetDynamicObject = new YourDynamicObject(); EntityToDynamicObjectConverter.convert(sourceEntity, targetDynamicObject); ``` 以上是两种常用的方法,可以根据你的需求选择其中一种来实现实体对象到动态对象赋值
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值