Skip to content

Instantly share code, notes, and snippets.

@linlihai
Last active August 29, 2015 13:57
Show Gist options
  • Save linlihai/9909793 to your computer and use it in GitHub Desktop.
Save linlihai/9909793 to your computer and use it in GitHub Desktop.
Deserialization

Q1:

Class A{
	List<String> arr;
	String name;
}
Class B{
	String arr; // List toJSON
	String name;
	public String toString{
		return "{\"arr\":\""+arr+"\",\"name\":\""+name+"\"}"; // standard JSONString
	}
}

现在得到 B对象 如何序列化成 A对象

Q2:

现在有N个文件,每个文件都是一个Object(不同Class)的JSONString, 如果要你设计一个框架 从 File --> Object --> DB 你会怎么设计?

@linlihai
Copy link
Author

linlihai commented Apr 2, 2014

没看过json序列化是怎么做,我们一起来通过代码来猜下是怎么做的

一般做法

class Person{
  private String name;
  private int age;

  // name,age的setter,getter
}

序列化代码

Person p = new Person();
p.setName("lihai");
p.setAge(18);
JSONObject j = JSONObject.fromObject(p);

j.toString()得到就是 {"name":"lihai","age":18}

反序列化代码

String json = "{\"name\":\"lihai\",\"age\":18}";
Person p = (Person)JSONObject.toBean(json,Person.class);

没有getter方法

Class Person{
  private String name;
  private int age;
  // name,age 的setter 没有 getter
}

还是原来的测试代码

Person p = new Person();
p.setName("lihai");
p.setAge(18);
JSONObject j = JSONObject.fromObject(p);

这个j.toString()竟然是{},一个空的JSON

String json = "{\"name\":\"lihai\",\"age\":18}";
Person p = (Person)JSONObject.toBean(json,Person.class);

得到的p 属性值都有,所以反序列化是正常的.

没有setter 方法

Class Tom{
  private String name ="Tom";
  private int age = 23;
  // name,age的getter方法
}

序列化测试代码

Tom p = new Tom();
JSONObject j = JSONObject.fromObject(p);

j.toString()得到是{"name":"Tom","age",23},好吧序列化正常了

反序列化测试代码

String json = "{\"name\":\"lihai\",\"age\":18}";
Tom p = (Tom)JSONObject.toBean(json,Tom.class);

pnameTom而不是lihai,如果Tom这样的写法不利于你理解,那我们再来修改下

Class Tom{
  private String name;
  private int age ;
  // name,age的getter方法
}

结果自己验证去把.

构造函数

Class Person{
  private String name;
  private int age;

  public Person(String name,int age){
    this.name = name;
    this.age = age;
  }
}

测试方法就变成这样了

Person p = new Person("lihai",18);
JSONObject json = JSONObject.formObject(p);

很显然 p.toString() 还是 {}

String json = "{\"name\":\"lihai\",\"age\":18}";
Person p = (Person)JSONObject.toBean(json,Person.class);

这次直接报错了

总结
看了这几个例子,我们可得出3个结论

  • 序列化是用getter方法 往json的map里面put值的
  • 反序列化是用setter方法 往对象里面设值的
  • 构建对象实例的时候 需要一个无参的构造方法

其他的情况

Class Person{
  public String name;
  public String age;
}
Class Person{
  private String name;
  private String age;

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

  public void setPersonAge(int age){
    this.age = age;
  }

  public void getPersonName(){
    return name;
  }

  public void getPersonAge(){
    return age;
  }

}

@linlihai
Copy link
Author

linlihai commented Apr 2, 2014

很显然Q1的问题就很好回答了

Class A{
    List<String> arr;
    String name;
    // getter setter
    public void setArr(String arrs){
       // String convert to List
    }
}

Q2的问题需要分2步看 :

  • 反序列化( 其实跟(Spring Bean 类似)
    file里面对应其实是成员变量的值, 相当于Spring 里面 xml 配置信息, 需要让容器里面注册一个Handler,来解析JSON的反序列化
  • 写到DB
    可以看作如何 管理 BeanDAO的一个映射关系, 可以用Class 为Key, 设计成一个监听的模式

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment