`
bit1129
  • 浏览: 1068080 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

[Gson一]非泛型POJO对象的反序列化

 
阅读更多

当要将JSON数据串反序列化自身为非泛型的POJO时,使用Gson.fromJson(String, Class)方法。自身为非泛型的POJO的包括两种:

1. POJO对象不包含任何泛型的字段

2. POJO对象包含泛型字段,例如泛型集合或者泛型类


Data类

a.不是泛型类,

b.Data中的集合List和Map都是泛型的

c.Data中不包含其它的POJO

 

   POJO

 

package gson.test2;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Data {
    private int id;
    private List<Integer> numbers;
    private Map<String, Integer> map;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public List<Integer> getNumbers() {
        return numbers;
    }

    public void setNumbers(List<Integer> numbers) {
        this.numbers = numbers;
    }

    public Map<String, Integer> getMap() {
        return map;
    }

    public void setMap(Map<String, Integer> map) {
        this.map = map;
    }

    public static Data create() {
        Data d = new Data();
        d.setId(123456);
        List<Integer> numbers = new ArrayList<Integer>();
        numbers.add(100);
        numbers.add(200);
        numbers.add(300);
        d.setNumbers(numbers);

        Map<String, Integer> maps = new HashMap<String, Integer>();
        maps.put("x", 9);
        maps.put("y", 99);
        maps.put("z", 999);

        d.setMap(maps);
        return d;
    }
}
 

 

   测试类:

  

package gson.test2;

import com.alibaba.fastjson.JSON;
import com.google.gson.Gson;

import java.util.*;

public class Test {
    public static void main(String[] args) {

        Data d = Data.create();
        String gson = new Gson().toJson(d);
        String fastjson = JSON.toJSONString(d);

        System.out.println(fastjson);
        System.out.println(gson);

        d = new Gson().fromJson(gson, Data.class);
        Map<String, Integer> map = d.getMap();
        Set<Map.Entry<String, Integer>> entries = map.entrySet();
        Iterator<Map.Entry<String, Integer>> iterator = entries.iterator();
        while (iterator.hasNext()) {
            Map.Entry entry = iterator.next();
            System.out.println(entry.getKey() + "\t" + entry.getValue());
        }
    }
}

 

Data类

a.不是泛型类,

b.Data中的集合List和Map都是泛型的

c.Data中包含其它的非泛型的POJO

 

   C聚合B,B聚合A,B中有个Date类型的实例变量

 

import java.util.List;

public class A {
    private String key;
    private String value;
    private List<String> primitives;

    public String getKey() {
        return key;
    }

    public void setKey(String key) {
        this.key = key;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public List<String> getPrimitives() {
        return primitives;
    }

    public void setPrimitives(List<String> primitives) {
        this.primitives = primitives;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        A a = (A) o;

        if (this.key == null && a.key != null || this.key != null && a.key == null) {
            return false;
        }
        if (this.value == null && a.value != null || this.value != null && a.value == null) {
            return false;
        }
        if (this.primitives == null && a.primitives != null || this.primitives != null && a.primitives == null) {
            return false;
        }

        if (!this.key.equals(a.key)) {
            return false;
        }

        if (!this.value.equals(a.value)) {
            return false;
        }

        if (this.primitives.size() != a.primitives.size()) {
            return false;
        }

        for (int i = 0; i < this.primitives.size(); i++) {
            String x = this.primitives.get(i);
            String y = a.primitives.get(i);
            if (!x.equals(y)) {
                return false;
            }
        }
        return true;
    }

    @Override
    public int hashCode() {
        int result = key != null ? key.hashCode() : 0;
        result = 31 * result + (value != null ? value.hashCode() : 0);
        result = 31 * result + (primitives != null ? primitives.hashCode() : 0);
        return result;
    }
}
 

 

 

import java.util.Date;
import java.util.List;

public class B {
    private Date currentTime;
    private List<A> rows;

    public Date getCurrentTime() {
        return currentTime;
    }

    public void setCurrentTime(Date currentTime) {
        this.currentTime = currentTime;
    }

    public List<A> getRows() {
        return rows;
    }

    public void setRows(List<A> rows) {
        this.rows = rows;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        B b = (B) o;

        if (this.currentTime == null && b.currentTime != null || this.currentTime != null && b.currentTime == null) {
            return false;
        }

        if (this.rows == null && b.rows != null || this.rows != null && b.rows == null) {
            return false;
        }

//        if (!this.currentTime.equals(b.currentTime)) {
//            return false;
//        }

        if (this.rows.size() != b.rows.size()) {
            return false;
        }

        for (int i = 0; i < this.rows.size(); i++) {
            A a1 = this.rows.get(i);
            A a2 = b.rows.get(i);
            if (!a1.equals(a2)) {
                return false;
            }
        }
        return true;
    }

    @Override
    public int hashCode() {
        int result = currentTime != null ? currentTime.hashCode() : 0;
        result = 31 * result + (rows != null ? rows.hashCode() : 0);
        return result;
    }
}
 

 

 

import java.util.List;

public class C {
    private A aObject;
    private List<B> rows;

    public A getAObject() {
        return aObject;
    }

    public void setAObject(A aObject) {
        this.aObject = aObject;
    }

    public List<B> getRows() {
        return rows;
    }

    public void setRows(List<B> rows) {
        this.rows = rows;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        C c = (C) o;

        if (this.aObject == null && c.aObject != null || this.aObject != null && c.aObject == null) {
            return false;
        }

        if (this.aObject != null && !this.aObject.equals(c.aObject)) {
            return false;
        }

        if (this.rows == null && c.rows != null || this.rows != null && c.rows == null) {
            return false;
        }

        if (this.rows.size() != c.rows.size()) {
            return false;
        }

        for (int i = 0; i < this.rows.size(); i++) {
            B b1 = this.rows.get(i);
            B b2 = c.rows.get(i);
            if (!b1.equals(b2)) {
                return false;
            }
        }


        return true;
    }

    @Override
    public int hashCode() {
        int result = aObject != null ? aObject.hashCode() : 0;
        result = 31 * result + (rows != null ? rows.hashCode() : 0);
        return result;
    }
}
 

    测试

import com.google.gson.Gson;
import org.junit.Assert;
import org.junit.Test;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class Controller {

    @Test
    public void testJSON2Java() {

        A a = new A();
        a.setKey("A-Key");
        a.setValue("A-Value");
        List<String> primitives = new ArrayList<String>();
        primitives.add("p1");
        primitives.add("p2");
        primitives.add("p3");
        a.setPrimitives(primitives);

        List<A> arrows = new ArrayList<A>();
        arrows.add(a);

        B b = new B();
        b.setCurrentTime(new Date());
        b.setRows(arrows);
        List<B> brows = new ArrayList<B>();
        brows = new ArrayList<B>();
        brows.add(b);


        A aObject = new A();
        aObject.setKey("A-B-Key1");
        aObject.setValue("A-B-Value1");
        aObject.setPrimitives(primitives);
        C c = new C();
        c.setAObject(aObject);
        c.setRows(brows);


        String str = new Gson().toJson(c);
        System.out.println(str);

        System.out.println("-----------------------------------------");
        C cc = new Gson().fromJson(str, C.class);
        Assert.assertTrue(c.equals(cc));
    }


}

 问题:当把B类的关于比较currentTime的注释打开,测试失败,调试发现,两个时间有1秒以内的偏差,不打算看源代码查找原因了。对于日期类型,保存数值而不是Date对象吧

 


 

Model类

a.不是泛型类,

c.Data中包含其它的泛型Data

 

package gson.test5;

import com.google.gson.Gson;

import java.util.ArrayList;
import java.util.List;

class Piece {
    private String name;
    private int weight;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getWeight() {
        return weight;
    }

    public void setWeight(int weight) {
        this.weight = weight;
    }
}


class Data<T> {
    private List<T> pieces;

    public List<T> getPieces() {
        return pieces;
    }

    public void setPieces(List<T> pieces) {
        this.pieces = pieces;
    }
}

class Model {
    private Data<Piece> data;

    public Data<Piece> getData() {
        return data;
    }

    public void setData(Data<Piece> data) {
        this.data = data;
    }
}

public class ModelTest {
    public static void main(String[] args) {
       List<Piece> pieces = new ArrayList<Piece>();
        Piece p1 = new Piece();
        p1.setName("Cat");
        p1.setWeight(10);
        pieces.add(p1);

        Piece p2 = new Piece();
        p2.setName("Dog");
        p2.setWeight(26);
        pieces.add(p2);

        Data<Piece> data = new Data<Piece>();
        data.setPieces(pieces);
        Model m = new Model();

        m.setData(data);
        String str = new Gson().toJson(m);
        System.out.println(str);

        m = new Gson().fromJson(str, Model.class);
    }
}

 

分享到:
评论

相关推荐

    gson解析泛型和将泛型转为json字符串

    要将泛型对象序列化为JSON字符串,你可以直接调用`Gson`的`toJson()`方法。例如,如果你有一个`Map, MyObject&gt;`,可以这样转换: ```java Gson gson = new Gson(); String jsonString = gson.toJson(myMap); ``...

    Gson 枚举类型的统一序列化/反序列化处理

    要实现自定义的枚举序列化和反序列化,我们需要创建一个继承自`Gson.TypeAdapter`的类。这个类需要重写`read()`和`write()`方法。`read()`方法负责将JSON解析为枚举值,而`write()`方法则将枚举值转化为JSON。下面是...

    fastjson、gson、jackson序列化和反序列化所用 json

    Gson的主要功能是通过`Gson.toJson()`方法实现对象到JSON的序列化,以及`Gson.fromJson()`方法实现JSON到对象的反序列化。Gson还支持自定义类型转换器,可以满足定制化的需求。 3. **Jackson**:Jackson是由...

    Gson解析Json 泛型

    Gson解析json,实现泛型解析数据,根据用户传入的类型,解析称用户需要的,Common \CommonList 里面的status message data相关的约定可以更具开发者与服务器的约定修改

    C++ JSON 序列化与反序列化

    需要注意的是,反序列化时需要确保JSON结构与C++对象结构匹配,否则可能会抛出异常。 **三、序列化与反序列化的细节** 1. 复杂类型的处理:除了基本类型外,还可以序列化和反序列化自定义类、结构体以及容器(如...

    Gson解析之自定义序列化和反序列化

    在Java开发中,Gson库是一个非常常用的JSON解析和序列化工具,由Google提供。它允许我们将Java对象转换为对应的JSON字符串,同时也能将JSON数据转换回Java对象。本篇文章将深入探讨如何在使用Gson时进行自定义的序列...

    fastJosn Gson Jackson 序列化和反序列化所需要的jarlib.rar

    例如,`ObjectMapper.readValue(jsonString, MyClass.class)`可以将JSON字符串反序列化为MyClass对象,而`objectMapper.writeValueAsString(myObject)`则可以将Java对象序列化为JSON字符串。 这三种库各有特色,...

    Android-Android上的Java对象反序列化

    一、Java对象序列化与反序列化 1. **序列化**: 序列化是将Java对象转换为字节流的过程,以便于存储或传输。通过实现`java.io.Serializable`接口,一个Java对象可以获得序列化的能力。序列化不仅可以保存对象的状态...

    Gson 中解决 json 反序列化时相同属性对应不同类型的值的问题(代码)

    Gson 中解决 json 反序列化时相同属性对应不同类型的值的问题(代码),对应文章链接:https://blog.csdn.net/ZiFung_Yip/article/details/89143255

    Java对象的序列化和反序列化实践

    对象序列化是将Java对象转换为字节流的过程,这使得对象可以被保存到磁盘上,或者在网络中进行传输。在Java中,要实现序列化,对象的类需要实现`java.io.Serializable`接口。例如,`ObjectSaver.java`文件可能包含一...

    C#和Java的序列化反序列化

    Java中,除了基本的序列化机制,还有许多第三方库如Jackson、Gson等,它们提供了更高效、更灵活的JSON序列化和反序列化功能。例如,Jackson库的`ObjectMapper`类能够方便地将Java对象转换为JSON字符串,反之亦然。 ...

    Json反序列化

    反序列化是将JSON格式的字符串转换为程序可直接使用的对象的过程,这对于处理网络请求返回的数据至关重要。在本篇文章中,我们将深入探讨JSON反序列化的概念、原因以及在实际开发中的应用。 一、什么是JSON反序列化...

    Java对象的序列化与反序列化Java开发Java经验技巧

    Java对象的序列化与反序列化是Java编程中一项重要的技术,它允许我们将Java对象转换为字节流,便于存储、传输或者在网络间传递。这一过程对于数据持久化、跨进程通信(如RMI,Remote Method Invocation)以及分布式...

    GSON实现Java对象的JSON序列化与反序列化的实例教程

    然后,利用Gson对象的toJson()方法,将Java对象序列化为JSON字符串。这个过程中,Gson库会根据Java对象的属性来构建JSON对象,并将对象的状态转换为JSON格式。 知识点五:反序列化过程 反序列化是指将JSON字符串...

    序列化与反序列化

    在Java中,可以使用`java.io.Serializable`接口标记一个类为可序列化的,然后使用`ObjectOutputStream`来序列化对象,而`ObjectInputStream`则用于反序列化。 在描述的"序列化与反序列化Demo"中,我们可以推测这...

    Java 多次序列化对象到同壹個文件及反序列化的问题

    总之,Java的序列化和反序列化是一个需要谨慎处理的过程,尤其是在多次操作和维护长期存储的对象时。理解`serialVersionUID`的作用,选择合适的序列化策略,并注意类结构的修改,是避免问题的关键。

    序列化工具(Gson, Jackson, FastJson, ProtoBuf)

    在IT领域,序列化是将对象的状态转换为可存储或传输的形式的过程,而反序列化则是将这种形式恢复为原始对象。在这个主题中,我们将深入探讨四种常用的序列化工具:Gson, Jackson, FastJson和ProtoBuf,以及与...

    反序列化利用工具ShiroExploit.V2.51.7z

    然而,如果反序列化的输入未经验证,恶意用户可以构造特定的序列化数据,从而触发非预期的行为,甚至执行任意代码。 ShiroExploit.V2.51是一款专注于Apache Shiro框架的反序列化利用工具。Apache Shiro是一款流行的...

    利用Google Gson实现JSON字符串和对象之间相互转换

    在上述代码中,`MyCustomAdapter`是自定义的类型适配器,Gson会在序列化或反序列化`User`对象时调用这个适配器。 ### 处理复杂类型 Gson支持多种复杂类型的转换,如列表、映射等。例如,将一个`List&lt;User&gt;`转换为...

    序列化反序列化大集中

    在IT领域,序列化与反序列化是两个关键的概念,特别是在数据存储、网络通信和对象持久化等场景中。这两个过程对于理解如何有效地处理和传递数据至关重要。本篇将深入探讨序列化和反序列化的概念,以及它们在实际应用...

Global site tag (gtag.js) - Google Analytics