json 泛型解析
- 格式:docx
- 大小:37.04 KB
- 文档页数:3
使用GSON和泛型解析约定格式的JSON串(转){"success":true,"data":##}success:代表是否访问成功data:后面跟着所需信息.基本相同的JSON结构,所以想定义一种通用模型对应到此结构。
但是,data中的数据类型不一致。
如第一种是简单对象,第二种是对象中嵌套数组,第三种是List。
针对data数据类型不一致的情况,使用泛型来解import java.io.Serializable;import ng.reflect.ParameterizedType;import ng.reflect.Type;import com.google.gson.Gson;public class CommonJson<T> implements Serializable {/** **/private static final long serialVersionUID = -3440061414071692254L;/** * 是否成功*/private Boolean success;/** * 数据*/private T data;public Boolean getSuccess() {return success;}public void setSuccess(Boolean success) {this.success = success;}public T getData() {return data;}public void setData(T data) {this.data = data;}}GSON对于泛型的支持不足,为了使GSON对于泛型进行解析,JSON解析与组装代码如下:public static CommonJson fromJson(String json, Class clazz) {Gson gson = new Gson();Type objectType = type(CommonJson.class, clazz);return gson.fromJson(json, objectType);}public String toJson(Class<T> clazz) {Gson gson = new Gson();Type objectType = type(CommonJson.class, clazz);return gson.toJson(this, objectType);}static ParameterizedType type(final Class raw, final Type... args) {return new ParameterizedType() {public Type getRawType() {return raw;}public Type[] getActualTypeArguments() {return args;}public Type getOwnerType() {return null;}};}以上两段代码可以满足第一种和第二种JSON的解析,对于第三种,data是List类型的,无法得到List<>的class,所以,针对第三种格式,实现代码如下:import java.io.Serializable;import ng.reflect.ParameterizedType;import ng.reflect.Type;import java.util.List;import com.google.gson.Gson;public class CommonJson4List<T> implements Serializable {/** **/private static final long serialVersionUID = -369558847578246550L;/** * 是否成功*/private Boolean success;/** * 数据*/private List<T> data;public Boolean getSuccess() {return success;}public void setSuccess(Boolean success) {this.success = success;}public List<T> getData() {return data;}public void setData(List<T> data) {this.data = data;}public static CommonJson4List fromJson(String json, Class clazz) {Gson gson = new Gson();Type objectType = type(CommonJson4List.class, clazz);return gson.fromJson(json, objectType);}public String toJson(Class<T> clazz) {做出评价,}}执行结果如下:{"success":true,"data":{"averageStarLevel":4.7,"remarkCount":10}}true4.7{"success":true,"data":{"page":10,"pageCount":29,"list":[{"starLevel":4,"remarkCotnent":"评价方未及时做出评价,系统默认满意!","remarkTime":"2013-02-27 07:21:48","explainContent":"","postMemberId" 5929b**6{"success":true,"data":[{"starLevel":4,"remarkCotnent":"评价方未及时做出评价,系统默认满意!","remarkTime":"2013-02-27 07:21:48","explainContent":"","postMemberId":"y**f","tpLogoURL":"http://i04.c y**fPs:文中说到Gson对泛型的支持不足,其实是不正确的,Gson对泛型做了以下支持:public static CommonJson4List fromJson(String json, Class clazz) {Gson gson = new Gson();Type objectType = new TypeToken<CommonJson4List<clazz>>() {}.getType();return gson.fromJson(json, objectType);}只需将获取类型的泛型类作为TypeToken的泛型参数构造一个匿名的子类,就可以通过getType方法获取一个parameterized类型,结果与type方法一致。
JSON转含有泛型属性的对象 在将 json 字符串转为对象时,如果对象含有泛型,在进⾏转换时需要指明泛型类型。
1. 对象只含有⼀个泛型属性时1.1 代码/*** @Describe:* @Author: chenfan* @Date: 2019/5/9 19:15*/@Data/*** 含有泛型属性的对象*/class OneGeneric<E>{E e;String ss;}@Data/*** 泛型对象*/class KeyMessage{String kk;}public class JsonTest {public static void main(String[] args) {// {"e": {"kk":"qwe"},"ss": "ssValue"}String data = "{\"e\": {\"kk\":\"qwe\"},\"ss\": \"ssValue\"}";Gson gson = new Gson();// OneGeneric : 外层对象类型 KeyMessage :嵌套的泛型类型OneGeneric one = gson.fromJson(data, new TypeToken<OneGeneric<KeyMessage>>() {}.getType());System.out.println(one);}}1.2 运⾏结果正确转换如下:1.3 泛型属性为集合类型时 此时和只有⼀个泛型对象时处理⽅式⼀样public class JsonTest {public static void main(String[] args) {// {"ss": "ssValue","list":[{"dd":"dd1"},{"dd":"dd2"}]}String data = "{\"ss\": \"ssValue\",\"list\":[{\"dd\":\"dd1\"},{\"dd\":\"dd2\"}]}";Gson gson = new Gson();OneGeneric grandMessage = gson.fromJson(data, new TypeToken<OneGeneric<Generic>>() {}.getType());System.out.println(grandMessage);}}/*** 含有泛型属性的对象*/@Dataclass OneGeneric<E>{List<E> list;String ss;}@Dataclass Generic{String dd;}2. 对象只含有多个泛型属性时2.1 代码/*** @Describe:* @Author: chenfan* @Date: 2019/5/9 19:15*/@Data/*** 含有多个泛型属性的对象*/class GrandMessage<K,V>{K key;V value;}/*** 泛型对象*/@Dataclass KeyMessage{String kk;}/*** 泛型对象*/@Dataclass ValueMessage{String vv;}/*** 测试类*/public class JsonTest {public static void main(String[] args) {// {"key": {"kk":"qwe"},"value": {"vv":"asd"}}String data = "{\"key\": {\"kk\":\"qwe\"},\"value\": {\"vv\":\"asd\"}}";Gson gson = new Gson();GrandMessage grandMessage = gson.fromJson(data, new TypeToken<GrandMessage<KeyMessage,ValueMessage>>() {}.getType());System.out.println(grandMessage);}}2.2 运⾏结果2.3 泛型的顺序问题 在进⾏对象转换时, TypeToken<GrandMessage<KeyMessage,ValueMessage>> 中的泛型类型顺序必须按照 GrandMessage<K,V>中声明的顺序,否则会对象属性全部为null3. 泛型类型嵌套3.1 代码@Dataclass GrandMessage<K>{K k;String msg;}@Dataclass OneGeneric<E>{E e;String one;}@Dataclass Generic{String dd;}/*** 测试类*/public class JsonTest {public static void main(String[] args) {// {"msg":"lili","k":{"one":"111","e":{"dd":"dddd"}}}String data = "{\"msg\":\"lili\",\"k\":{\"one\":\"111\",\"e\":{\"dd\":\"dddd\"}}}";Gson gson = new Gson();// 转换时的泛型顺序⼀定要严格按照对象的嵌套顺序GrandMessage grandMessage = gson.fromJson(data, new TypeToken<GrandMessage<OneGeneric<Generic>>>() {}.getType());System.out.println(grandMessage);}}3.2 运⾏结果4. ⾃定义转换逻辑 JSON转对象时,如果对象某个属性不确定(⽐如对象定义为Object,实际为 int 类型),需要⾃定义转换逻辑 显⽰指定 OpSessionControlMessage 的 messageId 为 int 类型:private static Gson gson2 = new GsonBuilder().registerTypeAdapter(new TypeToken<OpSessionControlMessage>(){}.getType(),new JsonDeserializer<OpSessionControlMessage>() {@Overridepublic OpSessionControlMessage deserialize(JsonElement json, Type typeOfT,JsonDeserializationContext context) throws JsonParseException {OpSessionControlMessage message = new OpSessionControlMessage();JsonObject jsonObject = json.getAsJsonObject();Set<Map.Entry<String, JsonElement>> entrySet = jsonObject.entrySet();for (Map.Entry<String, JsonElement> entry : entrySet) {Object ot = entry.getValue();if(entry.getKey().equals("messageId")){message.setOpType(((JsonPrimitive) ot).getAsInt());}}return message;}}).create();。
解析复杂json什么是JSON?JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于阅读和编写。
它基于JavaScript语言的一个子集,但是可以被多种编程语言使用。
JSON主要用于Web应用程序之间的数据交换,也可以用于存储和传输数据。
复杂JSON是什么?复杂JSON指的是包含多层嵌套结构、键值对数量较多、数据类型较为丰富的JSON数据。
这种类型的JSON数据在处理和解析时会比较困难,需要一定的技术和经验才能处理好。
如何解析复杂JSON?1. 使用现成的库目前市面上有很多能够处理JSON数据的库,如Python中常用的json库、JavaScript中常用的jQuery库等。
这些库已经被广泛使用,并且已经过了很多人使用和测试,因此使用它们可以大大提高开发效率。
2. 手动解析手动解析需要开发者对JSON格式有深入理解,并且需要花费更多时间来编写代码。
手动解析通常会涉及到递归、循环等操作,比较繁琐。
但是手动解析可以更加灵活地控制程序流程,并且能够更好地满足特定需求。
3. 使用工具除了使用库和手动解析外,还可以使用一些工具来解析JSON数据。
例如可以使用在线JSON解析器来快速查看JSON数据结构,也可以使用一些数据可视化工具来更好地理解和分析复杂JSON数据。
4. 熟悉JSON格式无论是使用库、手动解析还是工具,熟悉JSON格式都是必要的。
开发者需要了解JSON中的基本元素(键、值、数组、对象等),并且需要知道如何通过它们来访问和操作数据。
总结在处理复杂JSON数据时,开发者需要选择合适的方法来解析数据。
无论是使用现成的库、手动解析还是工具,都需要对JSON格式有深入理解,并且需要花费时间和精力来编写代码或者学习使用工具。
只有这样才能更好地处理复杂JSON数据,并且提高开发效率。
JSON三种数据解析方法引言JSON数据现在是我们开发中用的最多的,百分之八十的数据都是通过JSON方式进行传输,那么想要学好JSON解析就要了解什么是JSON数据,怎么快速解析它从而提升开发效率。
什么是JSON数据?•先看下面,这里有一段JSON数据,我们根据这段数进行讲解:{"paramz": {"feeds": [{"id": 299076,"oid": 288340,"category": "article","data": {"subject": "荔枝新闻3.0:不止是阅读","summary": "江苏广电旗下资讯类手机应用“荔枝新闻”于近期推出全新升级换代的3.0版。
","cover":"/Attachs/Article/288340/3e8e2c397c70469f8845fad73aa38165 _padmini.JPG","pic": "","format": "txt","changed": "2015-09-22 16:01:41"}}],"PageIndex": 1,"PageSize": 20,"TotalCount": 53521,"TotalPage": 2677}}•其实JSON数据就是一段字符串而已,只不过有不同意义的分隔符将其分割开来而已,我们看上面的符号,里面有[] ,{}等符号,其中•1 []中括号代表的是一个数组;•2 {}大括号代表的是一个对象•3 双引号“”表示的是属性值•4 冒号:代表的是前后之间的关系,冒号前面是属性的名称,后面是属性的值,这个值可以是基本数据类型,也可以是引用数据类型。
浅谈Android项⽬----JSON解析(4种解析技术详解)json简介1.概念:json全称是javaScript object Notation,是⼀种并轻量级的数据交换格式。
2.特点:1.本质就是具有特定格式的字符串2.json完全独⽴于编程语⾔3.json⽐xml数据传输的有效性要⾼出很多Android系统也原⽣的提供了JSON解析的API,但是它的速度很慢,⽽且没有提供简介⽅便的接⼝来提⾼开发者的效率和降低出错的可能。
因此,通常情况下,我们都会选择其他优秀的JSON解析实现,⽤以替代系统的API,⽬前JSON解析的开源实现主要包括⼀下三种:GsonJackJsonFastJsonJSON对象:JSON数组:先简单的来介绍⼀下原⽣的JSON解析API:他的特点是很⿇烦,对于复杂的json数据解析很容易出错使⽤:解析JSON对象的API:JsonObjectJSONObject(String json);将Json字符串解析成Json对象;getXxx(String name) ;根据name在json对象中得到相应的value值;private String ObjectanalysisTest(String string) {try {JSONObject jsonObject = new JSONObject(string);String name = jsonObject.getString("name");int age = jsonObject.optInt("age");String sex = jsonObject.optString("sex");return "name:" + name + " age:" + age + " sex:" + sex;} catch (JSONException e) {e.printStackTrace();}return null;}解析Json数组的API:JSONArrayJSONArray(String json);将json字符串解析成json数组;int length();得到json数组中元素的个数;getXxx(String name) ;根据name得到json数组中对应的元素数据。
gson 解析泛型方法以Gson解析泛型方法为标题,本文将介绍如何使用Gson库来解析泛型数据。
首先,我们将简要介绍Gson库的概念和功能,然后详细讲解如何使用Gson解析泛型数据,并提供一些实际应用场景和示例代码。
Gson是Google开发的一个Java库,用于在Java对象和JSON 数据之间进行序列化和反序列化。
它能够将Java对象转换为JSON 字符串,也可以将JSON字符串转换为Java对象。
Gson库提供了简单易用的API,能够满足大多数JSON操作的需求。
在实际开发中,我们经常会遇到需要解析泛型数据的情况。
泛型是Java语言中一种强大的特性,能够增加代码的灵活性和重用性。
然而,由于泛型的类型擦除机制,使得在运行时无法得知具体的泛型类型,这给解析泛型数据带来了一定的困难。
为了解决这个问题,Gson提供了一种特殊的类型Token,用于表示泛型类型。
Token是Gson中的一个内部类,它可以捕获泛型的类型信息。
通过使用Token,我们可以告诉Gson在解析泛型数据时应该使用哪种类型。
下面我们将通过一个具体的示例来演示如何使用Gson解析泛型数据。
假设我们有一个包含泛型的Java类:```javapublic class ApiResponse<T> {private int code;private String message;private T data;// 省略getter和setter方法}```假设我们从服务器获取到了一个JSON字符串,表示一个包含用户信息的API响应。
我们希望将这个JSON字符串解析为一个ApiResponse对象,并获取其中的用户信息。
我们需要创建一个TypeToken对象,用于表示泛型类型。
在这个例子中,我们需要解析的泛型类型是ApiResponse<User>,所以我们可以这样创建TypeToken对象:```javaTypeToken<ApiResponse<User>> typeToken = new TypeToken<ApiResponse<User>>() {};```接下来,我们可以使用Gson的fromJson方法将JSON字符串解析为ApiResponse对象:```javaApiResponse<User> response = gson.fromJson(jsonString, typeToken.getType());```这样,我们就成功地将JSON字符串解析为ApiResponse对象了。
解析json的3种方法JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它易于人们阅读和编写,同时也易于机器解析和生成。
在日常的软件开发中,我们经常会遇到需要解析JSON数据的情况。
本文将介绍解析JSON的三种方法,希望能够帮助大家更好地理解和应用JSON数据。
第一种方法是使用内置的JSON对象进行解析。
在JavaScript 中,可以使用JSON对象的parse方法将JSON字符串转换为JavaScript对象,或者使用stringify方法将JavaScript对象转换为JSON字符串。
这种方法简单易用,适用于简单的JSON数据解析和生成。
第二种方法是使用第三方库进行解析。
除了内置的JSON对象,还有许多第三方库可以用来解析JSON数据,例如在Node.js中常用的库有`jsonparse`、`json5`等。
这些库通常提供了更多的功能和更灵活的选项,可以满足各种复杂的JSON数据解析需求。
第三种方法是使用JSON Schema进行解析。
JSON Schema是一种用于描述JSON数据结构的语言,可以用来验证和解析JSON数据。
通过定义JSON Schema,可以规定JSON数据的结构和约束条件,然后使用相应的工具来解析和验证JSON数据。
这种方法适用于需要对JSON数据进行严格验证和规范的场景。
总的来说,解析JSON数据有多种方法可供选择,每种方法都有其适用的场景和特点。
在实际应用中,我们可以根据具体的需求和情况选择合适的方法来解析JSON数据,以便更好地处理和利用JSON数据。
希望本文介绍的三种方法能够对大家有所帮助,让大家在日常的软件开发中更加轻松地处理JSON数据。
gson 传入泛型参数当使用Gson库进行JSON数据的解析时,我们经常会遇到需要传入泛型参数的情况。
通常情况下,我们会使用Gson的fromJson()方法来将JSON数据转换为Java对象。
在这种情况下,我们可以传入泛型参数来指定要转换的目标对象的类型。
假设我们有一个JSON字符串,表示一个Person对象,我们想要将其转换为一个Person类的实例。
我们可以这样使用Gson的fromJson()方法:java.String json = "{\"name\":\"John\", \"age\":30}";Gson gson = new Gson();Person person = gson.fromJson(json, Person.class);在这个例子中,我们传入了Person.class作为第二个参数,以告诉Gson我们希望将JSON数据转换为Person类的实例。
这样,Gson就能够正确地解析JSON数据并将其转换为指定类型的对象。
另外,如果我们需要解析的目标对象是一个泛型类型,我们可以使用TypeToken来传入泛型参数。
例如,如果我们有一个包含泛型类型的List的JSON数据,我们可以这样使用Gson来进行解析:java.String json = "[{\"name\":\"John\", \"age\":30}, {\"name\":\"Alice\", \"age\":25}]";Gson gson = new Gson();Type listType = newTypeToken<List<Person>>(){}.getType();List<Person> personList = gson.fromJson(json, listType);在这个例子中,我们创建了一个TypeToken<List<Person>>(){}的匿名子类,并调用其getType()方法来获取表示List<Person>类型的Type对象。
利用泛型 jsonobject
泛型JSONObject是一种在JSON数据处理中广泛使用的工具。
它可以在不知道JSON数据结构的情况下动态解析和操作JSON数据,使得代码更加灵活和可维护。
使用泛型 JSONObject 可以实现以下功能:
1. 动态解析 JSON 数据,无需预定义数据结构。
2. 直接从 JSON 数据中取出对应的属性值,避免了手动解析JSON 数据的麻烦。
3. 支持嵌套的 JSON 数据结构,可以轻松地处理复杂的 JSON 数据。
4. 可以将 JSON 数据转换成 Java 对象,方便后续的业务逻辑处理。
使用泛型 JSONObject 的优点在于它的灵活性和适用性,可以在各种场景下使用,如数据传输、数据存储、数据处理等。
同时,它还具有高效性和可维护性,使得开发人员可以更加专注于业务逻辑的实现,提高开发效率和代码质量。
在使用泛型 JSONObject 时,需要注意以下几点:
1. 确保 JSON 数据格式正确、完整。
2. 适当处理 JSON 数据的异常情况,如 null 值、不存在的属性等。
3. 避免过度使用泛型 JSONObject,对于简单的数据结构,可以使用传统的 JSON 解析方式。
综上所述,泛型 JSONObject 是一种强大而灵活的工具,在处理JSON 数据时非常实用。
使用泛型 JSONObject 可以提高代码的可维护性和效率,同时也需要谨慎使用,确保数据处理的准确性和安全性。
Android之基于Gson的ParameterizedType进⾏泛型解析创建GsonResponsePasare解析类,class GsonResponsePasare<T> {T deal(String response) {Type gsonType = new TypeToken<CommonResponse<T>>() {}.getType();CommonResponse<T> commonResponse = new Gson().fromJson(response, gsonType);lg.e("Data is : " + commonResponse.data, "Class Type is : " + commonResponse.data.getClass().toString());return commonResponse.data;}}创建CommonResponse解析实体,并以泛型定义data数据结构class CommonResponse<T> {int status;T data;}1.解析基本数据类型String strResult = new GsonResponsePasare<String>().deal("{\"status\":-4,\"data\":\"xiaoxuan948\"}");lg.e("StringResult:" + strResult);debug结果如下,2.解析⾃定义对象(失败过程分析)给出⾃定义对象的定义class DataInfo {String name;}单个对象解析过程DataInfo dataInfoResult = new GsonResponsePasare<DataInfo>().deal("{\"status\":-4,\"data\":{\"name\":\"xiaoxuan948\"}}");lg.e("DataInfo:" + dataInfoResult.toString(), "Value:" + );debug结果如下,分析可知,commonResponse.data的数据类型并⾮期望的DataInfo类型,⽽是LinkedTreeMap类型,此处会提⽰强转异常。
json 泛型解析
如今,json已经成为了前端开发中最常用的数据格式。
但是,对于我
们的应用程序来说,这只是他们能够使用的,我们需要将其转换成可
操作的数据。
在解析json时,我们通常会将其映射到我们的应用程序
模型中,这就需要用到json泛型解析。
什么是json泛型解析?
泛型解析器通常是指,无论何种数据格式,都可以将其转换为特定数
据类型的解析器。
JSON泛型解析器的目的是使我们的json数据适应各种数据类型并处理数据。
这些数据类型可能涵盖了整个程序块,甚至
整个程序。
JSON泛型解析器的好处
JSON泛型解析器的一大好处是它可以从无序的JSON数据中提取有用的信息,而无需任何外部库。
因此,如果没有安装其他任何外部库,可
以很容易地实现JSON泛型解析器。
此外,泛型解析器可以轻松应用于
动态类型的语言,如JavaScript。
JSON泛型解析器通常通过反射机制实现(即运行时检查类型)。
因此,它们可以适应现有的类和结构,使我们可以非常方便地将JSON数据转
换为应用程序模型。
示例
为了更好地理解JSON泛型解析器,让我们看一个示例。
假设我们有一
个JSON字符串:
{
"name": "John",
"age": 28,
"gender": "male"
}
我们可以定义以下模型:
struct Person: Codable {
let name: String
let age: Int
let gender: String
}
现在,我们可以使用以下代码将JSON字符串转换为模型:
let jsonString = """
{
"name": "John",
"age": 28,
"gender": "male"
}
"""
let jsonData = jsonString.data(using: .utf8)!
let decoder = JSONDecoder()
let person = try decoder.decode(Person.self, from: jsonData) 在上面的代码片段中,我们使用JSONDecoder将JSON字符串转换为我
们定义的Person模型。
使用泛型解析器的好处在于:我们无需手动解析JSON,而是将其映射到我们的模型中。
结论
泛型解析器是处理JSON数据的强大工具。
他们可以大大简化我们的代码,并映射到我们的应用程序模型中。
我们可以使用他们提供的类型安全来避免错误,并确保我们的代码能够正确处理数据。
在我们的应用程序中实现JSON泛型解析器是必不可少的。