一、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
相关推荐
Gson是Google开发的一款强大的Java库,用于在Java对象和JSON数据之间进行映射。它使得Java对象可以轻松地转换为JSON格式,反之亦然。这个库被广泛应用于Android开发和服务器端Java应用中,特别是在处理JSON数据时,...
因此,在 Java 开发中,能够熟练地将对象或者数据结构转换为 JSON 格式是非常重要的技能。 #### 核心概念:JSON 与 Java 对象转换 1. **JSON 的基本结构**: - JSON 基本上是键值对的集合,这些键值对组成一个 ...
4. **解析JSON到Map**:如果Java类结构未知,可以将JSON转换为Map, Object>。 ```java public Map, Object> parseToMap(String jsonString) { try { // 使用org.json库 JSONObject jsonObject = new JSONObject...
这个工具类提供了一个方便的方法 `obj2Str`,该方法能够遍历给定对象的所有字段,并将其转换为JSON格式。 1. **对象到字符串的转换** - 如果对象为 `null`,则返回一个空的JSON对象 `{}` - 如果对象是 `Map` 类型...
- **将JSON字符串转换为Map**:使用`parseJSON2Map`方法将JSON字符串转换为`Map`对象,这样可以更容易地遍历和访问数据。 - **遍历Map**:通过迭代器遍历Map,打印出其中的键值对。 - **将JSON字符串转换为...
最后,我们将`jsonMap`转换为字符串并返回。 这个简单的实现有一个限制:它不处理嵌套的对象或集合。在实际应用中,你可能需要递归地处理复杂的类型,并确保正确地转换为JSON格式。例如,如果一个字段是另一个对象...
总的来说,这段代码提供了一个基础的Java对象到JSON字符串的转换工具,但请注意,它可能无法处理复杂的数据结构,例如嵌套的对象或自定义的序列化逻辑。在实际项目中,可以考虑使用更强大的库,如Jackson、Gson或...
当返回值是一个对象或者集合时,Spring MVC会利用内置的转换器如Jackson或Gson将其转化为JSON格式。对于简单的JSON结构,这非常方便。例如,如果你有一个`User`对象,可以这样做: ```java @GetMapping("/users/{id...