/src/test/java/com/alibaba/json/bvt/issue_3300/Issue3448.java

https://github.com/alibaba/fastjson · Java · 89 lines · 71 code · 15 blank · 3 comment · 0 complexity · a38d8851d5dc1477709b7861547fe651 MD5 · raw file

  1. package com.alibaba.json.bvt.issue_3300;
  2. import java.lang.reflect.ParameterizedType;
  3. import java.lang.reflect.Type;
  4. import java.util.ArrayList;
  5. import java.util.Collections;
  6. import java.util.List;
  7. import java.util.Map;
  8. import com.alibaba.fastjson.JSON;
  9. import com.alibaba.fastjson.TypeReference;
  10. import junit.framework.TestCase;
  11. import org.junit.Test;
  12. /**
  13. * @author yumin.pym
  14. */
  15. public class Issue3448 extends TestCase {
  16. public static class SelfTypeReference<T> {
  17. }
  18. @Test
  19. public void test() {
  20. List<Map<String, List<String>>> list = new ArrayList(4);
  21. list.add(Collections.singletonMap("key1", Collections.singletonList("item")));
  22. String text = JSON.toJSONString(list);
  23. System.out.println("text = " + text);
  24. List<Map<String, List<String>>> result = parseObject(text,
  25. new SelfTypeReference<Map<String, List<String>>>() {});
  26. System.out.println("result = " + result);
  27. TestCase.assertTrue(result.get(0) instanceof Map);
  28. TestCase.assertTrue(result.get(0).get("key1").get(0) instanceof String);
  29. }
  30. public <T> List<T> parseObject(String text, SelfTypeReference<T> selfTypeReference) {
  31. Type genericSuperclass = selfTypeReference.getClass().getGenericSuperclass();
  32. Type[] actualTypeArguments = ((ParameterizedType)genericSuperclass).getActualTypeArguments();
  33. return JSON.parseObject(text, new TypeReference<List<T>>(actualTypeArguments) {});
  34. }
  35. @Test
  36. public void test_1() {
  37. List<Map<String, List<String>>> list = new ArrayList(4);
  38. list.add(Collections.singletonMap("key1", Collections.singletonList("item")));
  39. String text = JSON.toJSONString(list);
  40. System.out.println("text = " + text);
  41. List<Map<String, List<String>>> result = parseObject2(text,
  42. new SelfTypeReference<Map<String, List<String>>>() {
  43. });
  44. System.out.println("result = " + result);
  45. }
  46. @Test
  47. public void test2() {
  48. List<List<String>> list = new ArrayList(4);
  49. list.add(Collections.singletonList("item"));
  50. String text = JSON.toJSONString(list);
  51. System.out.println("text = " + text);
  52. List<List<String>> result = parseObject2(text,
  53. new SelfTypeReference<List<String>>() {
  54. });
  55. System.out.println("result = " + result);
  56. }
  57. @Test
  58. public void test3() {
  59. List<String> list = new ArrayList(4);
  60. list.add("item");
  61. String text = JSON.toJSONString(list);
  62. System.out.println("text = " + text);
  63. List<String> result = parseObject2(text,
  64. new SelfTypeReference<String>() {
  65. });
  66. System.out.println("result = " + result);
  67. }
  68. public <T> List<T> parseObject2(String text, SelfTypeReference<T> selfTypeReference) {
  69. Type genericSuperclass = selfTypeReference.getClass().getGenericSuperclass();
  70. Type[] actualTypeArguments = ((ParameterizedType) genericSuperclass).getActualTypeArguments();
  71. return JSON.parseObject(text, new TypeReference<List<T>>(actualTypeArguments) {
  72. });
  73. }
  74. }