精华内容
下载资源
问答
  • 前言0.1解决方法1.gson的使用1.1对象转json1.2 json转对象1.3属性重命名 @SerializedName 注解的使用1.4 json序列化成map2. Gson的配置 0.前言 遇到一个场景使用gjson解析无固定模板的json串变成TreeMap时value值...

    0.前言

    遇到一个场景使用gjson解析无固定模板的json串变成TreeMap时value值出现两个双引号

    0.1解决方法

    如果直接用 JsonObject.toSring或者jo.get(“name”).toString的话,取出的值会有双引号,直接getAsString就没有双引号啦

    1.gson的使用

    1.1对象转json

    gson的maven

    <!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
    <dependency>
    	<groupId>com.google.code.gson</groupId>
    	<artifactId>gson</artifactId>
    	<version>2.8.7</version>
    </dependency>
    

    准备封装的对象

    package learn.JSON.gsonLearn;
    
    import java.math.BigDecimal;
    
    /**
     * @author WangWenLei
     * @DATE: 2021/6/21
     **/
    public class Student {
        private String name;
        private int age;
        private char sex;
        private float height;
        private BigDecimal money;
    
        public Student(String name, int age, char sex, float height, BigDecimal money) {
            this.name = name;
            this.age = age;
            this.sex = sex;
            this.height = height;
            this.money = money;
        }
    // getter/setter
    

    序列化

    package learn.JSON.gsonLearn;
    
    import com.google.gson.Gson;
    import com.google.gson.GsonBuilder;
    
    import java.math.BigDecimal;
    
    /**
     * @author WangWenLei
     * @DATE: 2021/6/21
     **/
    public class Main {
        public static void main(String[] args) {
            Student student = new Student("wwl",25,'y',170.2F,BigDecimal.valueOf(20210421));
            // 构建
            GsonBuilder gsonBuilder = new GsonBuilder();
            // 创建Gson对象
            Gson gson = gsonBuilder.create();
            // 序列化
            String s = gson.toJson(student);
            System.out.println(s);
        }
    }
    
    

    效果
    在这里插入图片描述

    1.2 json转对象

    package learn.JSON.gsonLearn;
    
    import com.google.gson.Gson;
    import com.google.gson.GsonBuilder;
    import com.google.gson.reflect.TypeToken;
    
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    
    /**
     * @author WangWenLei
     * @DATE: 2021/6/22
     **/
    public class JsonToObj {
        public static void main(String[] args) {
            String json = "{\"name\":\"wwl\",\"age\":25," +
                    "\"sex\":\"y\",\"height\":170.2,\"money\":20210421}";
            Gson gson = new GsonBuilder().create();
            // 单个class的解析
            Student student = gson.fromJson(json, Student.class);
            System.out.println(student.toString());
    
            // 简单数组的解析
            String json1 = "[\"Android\",\"Java\",\"PHP\"]";
            String[] strings = gson.fromJson(json1, String[].class);
            Arrays.stream(strings).forEach(item -> System.out.println(item + " "));
            System.out.println();
    
            //对于Java来说List<String> 和List<User> 这俩个的字节码文件
            // 只一个那就是List.class,这是Java泛型使用时要注意的问题 泛型擦除
            //Gson为我们提供了TypeToken来实现对泛型的支持,所以当我们
            // 希望使用将以上的数据解析为List<String>时需要这样写
            List<String> o = gson.fromJson(json1, new TypeToken<List<String>>() {}.getType());
            o.forEach(item -> System.out.print(item + " "));
            System.out.println();
    
            // 对于对象
            String jsonArray = "[{\"name\":\"wwl1\",\"age\":25,\"sex\":\"y\"," +
                    "\"height\":170.2,\"money\":20210421},{\"name\":\"wwl2\"," +
                    "\"age\":25,\"sex\":\"y\",\"height\":170.2,\"money\":20210421}]";
            List<Student> list = gson.fromJson(jsonArray,new TypeToken<List<Student>>(){}.getType());
            System.out.println(list.toString());
        }
    }
    
    

    1.3属性重命名 @SerializedName 注解的使用

    对接不同系统时经常会因为不同的参数命名方法而序列化成不同的名称,在接收时会造成不和谐如:
    期望接收json格式:

    {"name":"wwl1","age":25,"sex":"y","height":170.2,"money":20210421}
    

    实际接收参数

    {"NAME":"wwl1","AGE":25,"SEX":"y","HEIGHT":170.2,"MONEY":20210421}
    

    我们知道Gson在序列化和反序列化时需要使用反射

    	@SerializedName("NAME")
    	private String name;
    	@SerializedName("AGE")
    	private int age;
    	@SerializedName("SEX")
    	private char sex;
    	@SerializedName("HEIGHT")
    	private float height;
    	@SerializedName("MONEY")
    	private BigDecimal money;
    

    这样设置后序列化的样子,也得使用这个进行反序列化

    {"NAME":"wwl1","AGE":25,"SEX":"y","HEIGHT":170.2,"MONEY":20210421}
    

    2.4版本后 @SerializedName注解除了了value属性还有alternate属性(反序列化时字段的替代名称)接收一个String数组
    当上面的三个属性(email_address、email、emailAddress)都中出现任意一个时均可以得到正确的结果。

    1.当多种情况同时出时,以最后一个出现的值为准。
    2.value值与alternate里的值不能重复

    @SerializedName(value = "name",alternate = {"NAME","name1"})
    private String name;
    

    name1被反序列化成name

    String json = "{\"name1\":\"wwl1\",\"AGE\":25" +
                    ",\"SEX\":\"y\",\"HEIGHT\":170.2,\"MONEY\":20210421}";
    Gson gson = new GsonBuilder().create();
    // 单个class的解析
    Student student = gson.fromJson(json, Student.class);
    System.out.println(student.toString());
    

    在这里插入图片描述

    1.4 json序列化成map

    先得到一个json串再反序列化成map
    结果如下:
    在这里插入图片描述
    代码如下:

    package learn.JSON.gsonLearn;
    
    import com.google.common.reflect.TypeToken;
    import com.google.gson.Gson;
    import com.google.gson.GsonBuilder;
    import com.google.gson.JsonElement;
    import com.google.gson.JsonObject;
    
    import java.util.Map;
    import java.util.TreeMap;
    
    /**
     * @author WangWenLei
     * @DATE: 2021/6/22
     **/
    public class JsonToMap {
        public static void main(String[] args) {
            JsonObject jsonObject = new JsonObject();
            jsonObject.addProperty("name","wwl");
            jsonObject.addProperty("age","25");
            jsonObject.addProperty("height","170.2");
            jsonObject.addProperty("data","170.2");
            JsonObject jsonObject1 = new JsonObject();
            jsonObject1.addProperty("key1","value1");
            jsonObject1.addProperty("key2","value2");
            jsonObject.add("data", jsonObject1);
    
            Gson gson = new GsonBuilder().create();
            String json = gson.toJson(jsonObject);
            System.out.println(json);
            Map<String, Object> o = gson.fromJson(json, new TypeToken<TreeMap<String, Object>>() {}.getType());
            System.out.println(o.toString());
    
            System.out.println();
        }
    }
    
    

    2. Gson的配置

    // 当字段值为空或null时,依然对该字段进行转换   
    .serializeNulls()
    // json宽松
    .setLenient()
     //对结果进行格式化,增加换行,变得更好看
    .setPrettyPrinting()
    //时间转化为特定格式
    .setDateFormat("yyyy-MM-dd HH:mm:ss:SSS") 
     //不对没有用@Expose注解的属性进行操作
    .excludeFieldsWithoutExposeAnnotation()
     //当Map的key为复杂对象时,需要开启该方法
    .enableComplexMapKeySerialization()
    //防止特殊字符出现乱码。默认是GSON把HTML,转义用的
    .disableHtmlEscaping() 
    //为某特定对象设置固定的序列或反序列方式,自定义Adapter需实现JsonSerializer或者JsonDeserializer接口
    .registerTypeAdapter(Student.class,new StudentAdapter()) 
    

    文文的博客~

    展开全文
  • maven 地址 <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId>...json数组转 list public class Parite { private String cz; ...

    maven 地址

    <dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
        <version>2.8.6</version>
    </dependency>

    json数组转 list

    public class Parite {
        private String cz;
        private String oe;
    
        public String getCz() {
            return cz;
        }
    
        public void setCz(String cz) {
            this.cz = cz;
        }
    
        public String getOe() {
            return oe;
        }
    
        public void setOe(String oe) {
            this.oe = oe;
        }
    
        @Override
        public String toString() {
            return "Parite{" +
                    "cz='" + cz + '\'' +
                    ", oe='" + oe + '\'' +
                    '}';
        }
    }
    public class JSonToList {
        public static void main(String[] args) {
            String str = "[{\"cz\": \"2\",\"oe\": \"521190X935\"},{\"cz\": \"3\",\"oe\": \"521190X936\"}]";
            Gson gson = new Gson();
            List<Parite> list = gson.fromJson(str,  new TypeToken<List<Parite>>() {}.getType());
            for (Parite p:list){
                System.out.println(p.toString());
            }
        }
    }

    Parite{cz='2', oe='521190X935'}
    Parite{cz='3', oe='521190X936'}

    展开全文
  • 想要将得到的Json数据转化为相应的实体需要使用到gson这个工具包 ... ResultBean resultBean = gson.fromJson(JSONTool.stringToJSON(result),ResultBean.class); 这里遇到了一个问题: java.lang.

    想要将得到的Json数据转化为相应的实体需要使用到gson这个工具包
    具体步骤:
    1.引入依赖

    /**
    *build.gradle中引入工具包
    */
    implementation 'com.google.code.gson:gson:2.8.5'
    

    2.使用

       Gson gson;
       ResultBean resultBean = gson.fromJson(JSONTool.stringToJSON(result),ResultBean.class);
    

    这里遇到了一个问题:

    java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object com.google.gson.Gson.fromJson(java.lang.String, java.lang.Class)' on a null object reference
    

    百度了一下是因为返回的json中会有空值 所以要对其进行相应处理:

      public class NullStringToEmptyAdapterFactory implements TypeAdapterFactory {
    
            @Override
            @SuppressWarnings("unchecked")
            public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
                Class<T> rawType = (Class<T>) type.getRawType();
                if (rawType != String.class) {
                    return null;
                }
                //针对String的处理
                return (TypeAdapter<T>) new StringNullAdapter();
            }
        }
        public class StringNullAdapter extends TypeAdapter<String> {
            @Override
            public String read(JsonReader reader) throws IOException {
                if (reader.peek() == JsonToken.NULL) {
                    reader.nextNull();
                    //空的String对象进行赋值
                    return "";
                }
                return reader.nextString();
            }
    
            @Override
            public void write(JsonWriter writer, String value) throws IOException {
                if (value == null) {
                    writer.nullValue();
                    return;
                }
                writer.value(value);
            }
        }
    
         Gson gson = new GsonBuilder()
                            .registerTypeAdapterFactory(new NullStringToEmptyAdapterFactory())
                            .serializeNulls()
                            .create();
                    ResultBean resultBean = gson.fromJson(JSONTool.stringToJSON(result),ResultBean.class);
    
    展开全文
  • Gson.fromJson()方法

    2018-08-04 17:22:22
    Gson提供的fromJson()方法是实现从Json数据到单一实体对象类型、对象列表类型或者其他结构。   1、比如json字符串为:[{“name”:”张三”,”age”:18}]  Person person = gson.fromJson(str, Person.class); ...

    Gson提供的fromJson()方法是实现从Json数据到单一实体对象类型、对象列表类型或者其他结构。

     

    1、比如json字符串为:[{“name”:”张三”,”age”:18}] 

    Person person = gson.fromJson(str, Person.class);

    第一个参数是json字符串,第二个参数是需要转换对象的类型。

     

    2、转换成集合类型

    List<Person> ps = gson.fromJson(str, new TypeToken<List<Person>>(){}.getType());

    第一个参数是json字符串,第二个参数是Type类型的参数,表示类型。

    Type是个接口不能直接new,所以使用匿名内部类,实现Type接口,并调用getType()获取要转换成的类型。

    将整型数字存入json串,经gson解析后,可能会变成1.0,这时可以使用Double对其进行强转,再使用Double的intValue()方法将其转为整型,也可以使用第二种转换方式,得到数字。

     

     

     

    展开全文
  • 项目突然接着两次发生了oom,检查日志发现是在调用Gson.toJson()的时候发生的。 java.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOf(Arrays.java:3332) ~[na:1.8.0_181] at java.lang....
  • Gson.toJson返回到前台的是json字符串,,需要js的$.parseJSON解析才能获取字段值!!! @ResponseBody返回到前台的jsonjson对象,不需要解析,直接获取字段值!!! ...
  • com.google.gson.Gson.jar

    2018-03-03 19:11:36
    平常我们都是用net.sf.json.JSONObject来把对象转为json,但是当对象是一个对象列表如:List<Users> list =new ArrayList(); 用户列表对象,使用JSONObject jsonStu = JSONObject.fromObject(list); 就会报错,因为...
  • 发现调试日志中有如下...com.google.gson.JsonSyntaxException: Expected a com.google.gson.JsonObject but was com.google.gson.JsonNull 查看对应代码: if (!TextUtils.isEmpty(refString)) { try { digPos...
  • 一.、 com.google.gson.stream.MalformedJsonException 可能原因: ...使用toJsongson转为json eg: private Gson gson = new Gson(); String fieldstr = gson.toJson(obj); // 将gson转化为js
  • 对于解析复杂的json字符串成java bean的解决方法,有阿里提供的FastJson和Google提供的Gson两个方法进行解析,在编写java bean的时候会稍微注意一下,因为会有一些坑。 首先,如果解析嵌套的json成嵌套的java bean ...
  • Gson().fromJson将json字符串转成对象时,执行非常慢,原因可能是版本的问题 1.将1.3的版本升级成1.7的,转换速度就非常快了 附: json数据大小
  • GsonfromJson()方法

    千次阅读 2020-12-28 18:32:13
    Gson提供了fromJson()方法来实现从Json相关对象到Java实体的方法。 在日常应用中,我们一般都会碰到两种情况,转成单一实体对象和转换成对象列表或者其他结构。 先来看第一种: 比如json字符串为:[{“name”:”...
  • toString()与 gson.toJson(xxx)的区别

    千次阅读 2018-12-07 14:38:39
    一、json转String  ...String json = gson.toJson(posJ); 将json数据转为String,posJ为一段json数据,   1、使用 Object posJ = dangerRecordEntity.getInfo().getPos(); String string ...
  • 最近在调用自己封装的API接口的时候,API接口返回json数据,需要把json数据转为对象,进行业务判断和数据调用。封装的时候json 格式种类很多,需要分别进行数据转换: 代码演示: api接口返回的 result 字符串 ...
  • 解析json之com.google.gson.Gson

    千次阅读 2016-01-13 10:13:28
    需要导入的架包 [java] view plaincopy ...JSON与数组互转 [java] view plaincopy package com.itlwc.text;    import com.google.gson.Gson;    p
  • java:Gson fromJson()

    千次阅读 2018-12-16 19:30:05
    纯数组JSON 字符串转换 [ {"name": "zhangsan","age": "10","phone": "11111","email": "11111@11.com"},  ...
  • 场景:存在一个对象User的json字符串,json字符串中存在对象类型为Integer或Double的属性值为空字符串,使用Gson将字符串转换为对象时报错,报错信息如下: Exception in thread "main" ...
  • Gson提供了fromJson()方法来实现从Json相关对象到java实体的方法。 在日常应用中,我们一般都会碰到两种情况,转成单一实体对象和转换成对象列表或者其他结构。 先来看第一种: 比如json字符串为:[{“name”:”name...
  • json之com.google.gson.Gson

    2015-07-22 18:50:40
    json之com.google.gson.Gson
  • 一、Gson的使用: 1.实体类 package com.zsl.test; /** * 实体类 * @author zsl * @version 2015年1月3日 19:10:10 * */ public class Person { private int id; private String name; private
  • Gson().fromJson(json, Person. class ); 8 9 System.out.println(person); 10 11 String json1 = "{'personList':[{'name':'wyz','age':25},{'name':'wyz1','age':26}]}" ; 12 13 User user = ...
  • 在拉取数据时,有时候会遇到一些错误数据导致整张表都无法正常存储的情况,比如这种错误: ... 原json数据是这样的: { "id": "120207568323752...
  • Gson数据类型转换异常 java.lang.ClassCastException: com.google.gson.internal.出现原因已经解决方案, 今天写项目发现了一个用gson做JSON串回List的数据对象时,报了这个... userList=gson.fromJson(jsonStr),Li...
  • Gson fromJson() 用法

    千次阅读 2018-08-23 09:01:00
    1.纯数组JSON 字符串转换 [ {"name": "zhangsan","age": "10","phone": "11111","email": "11111@11.com"}, {"name": "lisi","age": "20","phone": "22222","email": "22222@22.com"}, ...] 解析代码如下...
  • Android下使用Gson fromJson数据总是返回null Gson的使用相当简单,可以在json和java对象之间很方便的做转换,特别是依赖GsonFormat 工具,可以自动生成POJO的Bean/类,使用方法网上介绍很多,就不再熬述。 最近在...
  • 1.Header header = (Header) gson.fromJson(json, Header.class); 2.Data entity = (Data) gson.fromJson(header.getData(), Data.class) 实体1 header private String dataType; private String sendTime; ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 37,021
精华内容 14,808
关键字:

gson.fromjson