Nutz.Json 转为Java对象

Jul 10, 2017 10:38:44 AM

作者:wendal

Json字符串转Java对象, 分成几种情况

从目标对象的类型看:

  • 无Pojo类对应
    • Json.fromJson(source/来源参数/)
  • 有Pojo类对应
    • Json.fromJson(Class<T> klass, source/来源参数/)
    • Json.fromJson(Type t, source/来源参数/)
  • Pojo集合或Map嵌套

    • Json.fromJsonAsArray(Class<T> klass, source/来源参数/)
    • Json.fromJsonAsList(Class<T> klass, source/来源参数/)
    • Json.fromJsonAsMap(Class<T> klass, source/来源参数/)
      从来源看,一般无难度吧
  • 字符串

    • Json.fromJson(CharSequence c)
    • Json.fromJson(Class<T> klass, CharSequence c)
  • Reader
    • Json.fromJson(Reader c)
    • Json.fromJson(Class<T> klass, Reader reader)
  • File
    • Json.fromJsonFile(Class<T> klass, File f)

无Pojo类对应

这算是最原始的方法了

  1. Object obj = Json.fromJson(str);

obj的实际类型可能是 Map,List,基本数据类型的封装类型, String

有Pojo类对应(简单)

最常用的方法,也是入门级的方法

  1. Pet pet = Json.fromJson(Pet.class, str);
  2. pet = Json.fromJson(Pet.class, reader);
  3. pet = Json.fromJsonFile(Pet.class, new File("pet.json"));

有Pojo类对应(复杂自定义)

fromJson方法中最复杂最灵活的方法群

  1. String str = "[{dongdong:{age:80}}]";
  2. List<Map<String, Pet>> list = (List<Map<String, Pet>>)Json.fromJson(NutType.list(NutType.mapStr(Pet.class)), str/*其他源也可以*/);
  3. assertEquals(80, list.get(0).get("dongdong").getAge());// Junit断言一下,肯定是80啦

Pojo集合或Map嵌套

这群方法事实上就是 有Pojo类对应(复杂自定义) 中的简写形式

  1. String str = "{dongdong:{age:80}}";
  2. Map<String, Pet> pets = Json.fromJsonAsMap(Pet.class, str/*其他源也可以*/);
  3. assertEquals(80, pets.get("dongdong").getAge());// Junit断言一下,肯定是80啦

一通百通,哈哈,仔细琢磨一下吧

复杂泛型

  1. String str = "{abc:{def:{age:1}}}";
  2. Map<String, Map<String, Record>> map;
  3. // 1.r.59及之前版本的做法
  4. NutType t = NutType.mapStr(NutType.mapStr(Record.class));
  5. map = (Map<String, Map<String, Record>>) Json.fromJson(type, str);
  6. // 1.r.60可以这样写. 通构建一个PType的匿名内部类实现
  7. map = Json.fromJson(new PType<Map<String, Map<String, Record>>>(){}, str);

PType是NutType的子类,老版本可以直接拷贝其源码,实现类似的调用方法.

本页面的文字允许在知识共享 署名-相同方式共享 3.0协议GNU自由文档许可证下修改和再使用。

原文: http://nutzam.com/core/json/from.html