`
jiuyuehe
  • 浏览: 181149 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

5分钟 玩转google Gson

阅读更多

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;
	}
改成饥饿就行了

 

 

     

4
3
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics