google gson 是一个非常轻量的java 对象与json相互转化工具。
入门也非常简单,下面来看几种常用的方法
- public class Pet{
- private String ma;
- private String ses;
- private String add;
- private String oct;
- private List<Integer> managers = new ArrayList<Integer>();
- //get set
- }
以此pet类作为例子
- Gson g = new Gson();
- String json = g.toJson(p);
- Pet pt= g.fromJson(json, Pet.class);
1 隐藏某个字段
当然还有特殊要求,必须pet 转化json 所有字段都转化了,现在是隐藏某个字段,很简单,只需使用annotation @Expos 暴露出来就行,需要的加上,不需要的不加
- @Expose
- private String ma;
- @Expose()
- private String ses;
- @Expose()
- private String add;
- private String oct;
这是gson 就应该这么new
- Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
- System.out.println(gson.toJson(p));
- System.out.println(gson.toJson(oList));
2 换属性名字
- public class SomeClassWithFields {
- @SerializedName("name") private final String someField;
- private final String someOtherField;
- public SomeClassWithFields(String a, String b) {
- this.someField = a;
- this.someOtherField = b;
- }
- }
- //The following shows the output that is generated when serializing an instance of the above example class:
- SomeClassWithFields objectToSerialize = new SomeClassWithFields("a", "b");
- Gson gson = new Gson();
- String jsonRepresentation = gson.toJson(objectToSerialize);
- System.out.println(jsonRepresentation);
- ===== OUTPUT =====
- {"name":"a","someOtherField":"b"}
3 加版本号
- public class User {
- private String firstName;
- private String lastName;
- @Since(1.0) private String emailAddress;
- @Since(1.0) private String password;
- @Since(1.1) private Address address;
- }
4 InputStream 转 json
- public List<Message> readJsonStream(InputStream in) throws IOException {
- JsonReader reader = new JsonReader(new InputStreamReader(in, "UTF-8"));
- try {
- return readMessagesArray(reader);
- } finally {
- reader.close();
- }
- }
- public List<Message> readMessagesArray(JsonReader reader) throws IOException {
- List<Message> messages = new ArrayList<Message>();
- reader.beginArray();
- while (reader.hasNext()) {
- messages.add(readMessage(reader));
- }
- reader.endArray();
- return messages;
- }
- public Message readMessage(JsonReader reader) throws IOException {
- long id = -1;
- String text = null;
- User user = null;
- List<Double> geo = null;
- reader.beginObject();
- while (reader.hasNext()) {
- String name = reader.nextName();
- if (name.equals("id")) {
- id = reader.nextLong();
- } else if (name.equals("text")) {
- text = reader.nextString();
- } else if (name.equals("geo") && reader.peek() != JsonToken.NULL) {
- geo = readDoublesArray(reader);
- } else if (name.equals("user")) {
- user = readUser(reader);
- } else {
- reader.skipValue();
- }
- }
- reader.endObject();
- return new Message(id, text, user, geo);
- }
- public List<Double> readDoublesArray(JsonReader reader) throws IOException {
- List<Double> doubles = new ArrayList<Double>();
- reader.beginArray();
- while (reader.hasNext()) {
- doubles.add(reader.nextDouble());
- }
- reader.endArray();
- return doubles;
- }
- public User readUser(JsonReader reader) throws IOException {
- String username = null;
- int followersCount = -1;
- reader.beginObject();
- while (reader.hasNext()) {
- String name = reader.nextName();
- if (name.equals("name")) {
- username = reader.nextString();
- } else if (name.equals("followers_count")) {
- followersCount = reader.nextInt();
- } else {
- reader.skipValue();
- }
- }
- reader.endObject();
- return new User(username, followersCount);
- }
更多功能请访问http://google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/index.html 上面代码例子也有的是来自api,api非常详细。
对ztree 里面复杂的json 格式转化非常简单。
补充:使用的hibernate的项目 中经常会出现级联对象中,外键对象无法转化出来,或转出来后为null 的现像。例如:
- */
- @RequestMapping(value = "/getTopicByBroad/{broadId}/{pageIndex}/{pageSize}" , produces = "text/plain;charset=UTF-8")
- @ResponseBody
- public String getTopicByBroad(@PathVariable int broadId,@PathVariable int pageIndex,@PathVariable int pageSize) {
- Page<Topic> topics = topicService.getTopicByBroad(pageIndex, pageSize, broadId);
- List<Topic> ts = topics.getResult();
- //此for循环中,对象是有值的,
- for (Topic topic : ts) {
- Broad b = topic.getBroad();
- System.out.println(b.getBroadName());
- }
- Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
- String json = gson.toJson(topics.getResult().get(0).getBroad());
- System.out.println(json);//broad:{},user:{}无值
- return json;
- }
其实原因很简单,因为hibernate 默认配置了懒加载,
- @ManyToOne(fetch = FetchType.LAZY)
- @JoinColumn(name = "user_id")
- public TtUser getTtUser() {
- return this.ttUser;
- }
- public void setTtUser(TtUser ttUser) {
- this.ttUser = ttUser;
- }
- //改成eager
- @ManyToOne(fetch = FetchType.LAZY)
- @JoinColumn(name = "broad_id")
- public Broad getBroad() {
- return this.broad;
- }