`
Josh_Persistence
  • 浏览: 1649836 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类

Google Gson - 将给定的Json转换为Map中嵌套Map的数据结构

阅读更多

一、Json如下

 

{
    "lbmember_hash": {
        "10.2.180.74:1300": {
            "protocol": "ANY",
            "opsState": "up",
            "ip": "10.2.180.74",
            "server": "10.2.180.74",
            "port": "1300"
        },
        "10.2.181.160": {
            "protocol": "ANY",
            "opsState": "up",
            "ip": "10.2.181.160",
            "server": "10.2.181.160",
            "port": "1119"
        }
    }
}

 

 

二、定义对应的Java Bean

 

/**
 * 
 */
package com.ebay.tools.cms.sync.model.lb;

/**
 * 
 * LBMember ResourceId: ip:port
 * 
 * @author Josh Wang(Sheng)
 * 
 * @email  swang6@ebay.com
 * 
 */
public class LBMemberSource extends LBSource {

	private static final long serialVersionUID = -3579858609342297799L;
	
	private String memberName; // ip:port - resource id

	private String ip;
	
	private String opsState;
	
	private int port;
	
	private String protocol;
	
	private String server;
	
	private String label;

	public String getIp() {
		return ip;
	}

	public void setIp(String ip) {
		this.ip = ip;
	}

	public String getOpsState() {
		return opsState;
	}

	public void setOpsState(String opsState) {
		this.opsState = opsState;
	}

	public int getPort() {
		return port;
	}

	public void setPort(int port) {
		this.port = port;
	}

	public String getProtocol() {
		return protocol;
	}

	public void setProtocol(String protocol) {
		this.protocol = protocol;
	}

	public String getServer() {
		return server;
	}

	public void setServer(String server) {
		this.server = server;
	}

	public String getLabel() {
		return label;
	}

	public void setLabel(String label) {
		this.label = label;
	}

	public String getMemberName() {
		return memberName;
	}

	public void setMemberName(String memberName) {
		this.memberName = memberName;
	}

	@Override
	public String toString() {
		return "LBMemberSource [memberName=" + memberName + ", ip=" + ip + ", opsState=" + opsState + ", port=" + port + ", protocol=" + protocol
				+ ", server=" + server + ", label=" + label + "]";
	}
	
	
	
}

 

三、给出具体的转换类

/**
 * 
 */
package com.ebay.tools.cms.sync.utils;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Map;

import com.ebay.tools.cms.sync.model.SyncSource;
import com.ebay.tools.cms.sync.model.lb.LBMemberSource;
import com.google.common.reflect.TypeToken;
import com.google.gson.Gson;

/**
 * @author Josh Wang(Sheng)
 * 
 * @email  swang6@ebay.com
 * 
 */
public class GsonConverter<T extends SyncSource> {
	
	private Type genericType;
	
	public GsonConverter() {
		Type typeClass = getClass().getGenericSuperclass();
		genericType = ((ParameterizedType) typeClass).getActualTypeArguments()[0];
	}
	
	public static Map<String, String> json2Map(String jsonString) {
		Type type = new TypeToken<Map<String, String>>() {
			private static final long serialVersionUID = 1L;}.getType();
		Gson gson = new Gson();
		return gson.fromJson(jsonString, type);
	}
	
	public  Map<String, Map<String, LBMemberSource>> json2Maps(String jsonString) {
		Type typeToken = buildTypeToken(genericType);
		
		Gson gson = new Gson();
		return gson.fromJson(jsonString, typeToken);
	}
	
	private Type buildTypeToken(Type genericType) {
		Type typeToken = null;
		if (genericType.toString().endsWith(LBMemberSource.class.getSimpleName())) {
			typeToken = new TypeToken<Map<String, Map<String, LBMemberSource>>>() {
				private static final long serialVersionUID = 1L;}.getType();
		}
		
		return typeToken;
	}
	
}

 

 

 

 

四、为便于测试,写一个IOUtils来读取上面的json文本,从而避免在测试用例中麻烦的输入Json文本

/**
 * 
 */
package com.ebay.tools.cms.sync.utils;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;



/**
 * @author Josh Wang(Sheng)
 * 
 * @email  swang6@ebay.com
 * 
 */
public class IOUtils {

	public static String fileToString(String filePath) throws IOException {
		File file = new File(filePath);
		
		InputStream in = new FileInputStream(file);
		try {
			return org.apache.commons.io.IOUtils.toString(in);
		} finally {
			org.apache.commons.io.IOUtils.closeQuietly(in);
		}
	}

}

 

五、最后给出测试类

/**
 * 
 */
package com.ebay.tools.cms.sync.util;


import java.io.IOException;



import java.util.Map;

import org.junit.Assert;
import org.junit.Test;

import com.ebay.tools.cms.sync.BaseTest;
import com.ebay.tools.cms.sync.model.lb.LBMemberSource;
import com.ebay.tools.cms.sync.utils.GsonConverter;
import com.ebay.tools.cms.sync.utils.IOUtils;

/**
 * @author Josh Wang(Sheng)
 * 
 * @email  swang6@ebay.com
 * 
 */
public class TestGsonConverter extends BaseTest {
	

	@Test
	public void json2Map() throws IOException {
		String lbmemberHashPath = "src/test/resources/lbmember_hash.txt";
		String hashString = IOUtils.fileToString(lbmemberHashPath);
		Assert.assertNotNull(hashString);
		
		Map<String, Map<String, LBMemberSource>> map = new GsonConverter<LBMemberSource>(){}.json2Maps(hashString);
		for (Map.Entry<String, Map<String, LBMemberSource>> entry : map.entrySet()) {
			printHighlight(entry.getKey());
			for (Map.Entry<String, LBMemberSource> entry2 : entry.getValue().entrySet()) {
				print(entry2.getValue().toString());
			}
		}
	}
	
}

 

 本例中使用了Google Json中的TypeToken来获取具体泛型类的泛型参数类型,有关获取Java中泛型类的泛型参数类型,可参见另一篇博客:http://josh-persistence.iteye.com/blog/2165613

 

 

1
0
分享到:
评论

相关推荐

    Gson-2.8.1的官方jar包合集【gson-2.8.1.jar,gson-2.8.1-sources.jar】

    Gson是Google开发的一款强大的Java库,用于将Java对象转换为JSON格式的字符串,以及将JSON数据解析回等效的Java对象。这个压缩包包含了Gson库的版本2.8.1,它提供了两个主要的组件:`gson-2.8.1.jar`和`gson-2.8.1-...

    GSON JAR包 最新包和历史包 gson-2.10.1

    介绍:Gson is a Java library that can be used to convert Java Objects into their JSON representation. It can also be used to convert a JSON string to an equivalent Java object. 压缩包里有以下文件: ...

    Gson-2.8.2 官方jar包合集【gson-2.8.2.jar,gson-2.8.2-sources.jar】

    Gson是Google开发的一款强大的Java库,用于将Java对象转换为JSON字符串,以及将JSON数据反序列化回等效的Java对象。这个压缩包包含了Gson的2.8.2版本,提供了三个重要的组成部分:`gson-2.8.2.jar`、`gson-2.8.2-...

    Gson-2.8.0的官方jar包合集【gson-2.8.0.jar,gson-2.8.0-sources.jar】

    Gson-2.8.0的官方jar包合集【gson-2.8.0.jar,gson-2.8.0-sources.jar,gson-2.8.0-javadoc.jar】,JSON解析类库Gson库的jar包。

    google-gson-2.2.4.zip

    Gson库允许开发者将Java对象转换为对应的JSON字符串,反之亦然,使得数据交换和存储变得更加便捷。 首先,我们来了解一下JSON(JavaScript Object Notation)——这是一种轻量级的数据交换格式,易于人阅读和编写,...

    gson-2.8.0-API文档-中文版.zip

    赠送jar包:gson-2.8.0.jar; 赠送原API文档:gson-2.8.0-javadoc.jar; 赠送源代码:gson-2.8.0-sources.jar; 赠送Maven依赖信息文件:...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

    gson-2.8.6-API文档-中文版.zip

    赠送jar包:gson-2.8.6.jar; 赠送原API文档:gson-2.8.6-javadoc.jar; 赠送源代码:gson-2.8.6-sources.jar; 赠送Maven依赖信息文件:...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

    gson-2.3.jar(含gson-2.3-javadoc.jar和gson-2.3-sources.jar)

    开发者可以在他们的项目中引入这个JAR文件,以利用Gson库解析JSON字符串到Java对象,或者将Java对象转换为JSON格式。例如,你可以使用`Gson()`构造器创建一个Gson实例,然后使用`toJson()`方法将Java对象转化为JSON...

    google-json-gson-master.zip

    4. **复杂对象处理**:Gson能处理嵌套的对象和数组,以及泛型类型,使得复杂的Java数据结构也能轻松转换成JSON。 5. **字段映射控制**:通过注解或配置,可以控制哪些字段被序列化或反序列化,以及如何进行转换。 ...

    gson-2.8.6.jar

    1. **对象到JSON字符串转换**:通过`Gson().toJson()`方法,你可以将任何Java对象转换为JSON字符串。这包括基本类型、复杂对象、集合和数组。 2. **JSON字符串到对象转换**:使用`Gson().fromJson()`方法,可以从...

    google-gson-2.2.2Jar包

    谷歌的Gson库是一个强大的Java库,用于将Java对象转换为JSON格式的字符串,反之亦然。这个"google-gson-2.2.2Jar包"是Gson库的一个特定版本,版本号为2.2.2。在Java开发中,它被广泛应用于网络数据的传输、存储以及...

    gson-2.2.4.jar下载

    除了基本类型的转换,Gson还支持复杂的数据结构,如数组、集合和自定义类型。例如,如果你有一个包含多个`Person`对象的列表,你可以这样处理: ```java List&lt;Person&gt; people = new ArrayList(); // 添加Person对象...

    google-gson-2.2.2-release

    例如,你可以创建一个Java对象,然后使用`Gson().toJson()`方法将其转换为JSON格式的字符串,便于在网络上传输或保存到文件中。 2. **反序列化**:将JSON字符串解析回Java对象。当你接收到JSON数据时,可以通过`...

    gson-2.8.6.rar

    4. 复杂类型处理:Gson支持数组、列表、Map和其他复杂数据结构的JSON转换。它可以自动处理嵌套的对象和数组。 5. 基本类型转换:Gson可以轻松地将基本数据类型(如int、double、boolean)转换为JSON值,反之亦然。 ...

    gson-2.8.9-API文档-中文版.zip

    赠送jar包:gson-2.8.9.jar; 赠送原API文档:gson-2.8.9-javadoc.jar; 赠送源代码:gson-2.8.9-sources.jar; 赠送Maven依赖信息文件:...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

    gson-gson-parent-2.10.1.tar.gz

    Gson是Google开发的一个Java库,用于在Java对象和JSON数据之间进行映射。这个库使得Java对象可以轻松地转换成JSON格式,并且能够将JSON数据解析回等效的Java对象。`gson-gson-parent-2.10.1.tar.gz`是一个压缩包,...

    Android使用Kotlin利用Gson解析多层嵌套Json数据

    Android使用Kotlin利用Gson解析多层嵌套Json数据

    Google的json数据转换的jar包gson-2.2.4

    通过查看源代码,我们可以看到Gson是如何处理复杂的数据结构,如集合、自定义类、泛型等,并能学习到如何进行高效的JSON操作。 Gson库的主要特点和关键功能包括: 1. **简单易用**:Gson通过`Gson()`构造函数创建...

    gson-2.8.0.zip json解析工具 官方jar包合集

    Gson-2.8.0的官方jar包合集【gson-2.8.0.jar,gson-2.8.0-sources.jar,gson-2.8.0-javadoc.jar】,JSON解析类库Gson库的jar包。

Global site tag (gtag.js) - Google Analytics