androidjson序列化
⑴ android使用gson解析嵌套复杂的json数据,数据怎么显示到布局上,布局怎么写
首先先讲一个比较简单点的例子(最简单的我就不讲啦,网上很多),帮助新手理解Gson的使用方法:
比如我们要解析一个下面这种的Json:
String json = {"a":"100","b":[{"b1":"b_value1","b2":"b_value2"},{"b1":"b_value1","b2":"b_value2"}],"c":{"c1":"c_value1","c2":"c_value2"}}
首先我们需要定义一个序列化的Bean,这里采用内部类的形式,看起来会比较清晰一些:
public class JsonBean {
public String a;
public List<B> b;
public C c;
public static class B {
public String b1;
public String b2;
}
public static class C {
public String c1;
public String c2;
}
}
很多时候大家都是不知道这个Bean是该怎么定义,这里面需要注意几点:
1、内部嵌套的类必须是static的,要不然解析会出错;
2、类里面的属性名必须跟Json字段里面的Key是一模一样的;
3、内部嵌套的用[]括起来的部分是一个List,所以定义为 public List<B> b,而只用{}嵌套的就定义为 public C c,
具体的大家对照Json字符串看看就明白了,不明白的我们可以互相交流,本人也是开发新手!
Gson gson = new Gson();
java.lang.reflect.Type type = new TypeToken<JsonBean>() {}.getType();
JsonBean jsonBean = gson.fromJson(json, type);
然后想拿数据就很简单啦,直接在jsonBean里面取就可以了!
如果需要解析的Json嵌套了很多层,同样可以可以定义一个嵌套很多层内部类的Bean,需要细心的对照Json字段来定义哦。
⑵ 如何:对 JSON 数据进行序列化和反序列化
主要用于存储对象状态为另一种通用格式,比如存储为二进制、xml、json等等,把对象转换成这种格式就叫序列化,而反序列化通常是从这种格式转换回来。 使用序列化主要是因为跨平台和对象存储的需求,因为网络上只允许字符串或者二进制格式,而文...
⑶ 如何在android中使用jackson做json序列化和反序列化
T data = null;
try {
ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
data = mapper.readValue(jsonString, type);
} catch (IOException e) {
e.printStackTrace();
}
return data;
}
//对象转为json字符串
public static String objectToJson(Object object) {
ObjectMapper m = new ObjectMapper();
m.configure(SerializationConfig.Feature.WRITE_NULL_PROPERTIES, false);
ObjectWriter ow = m.writer().withDefaultPrettyPrinter();
String message = "";
try {
message = ow.writeValueAsString(object);
} catch (IOException e) {
⑷ json序列化
php"><?php
$str="_.gm['3006078']=['12-03<br>06:15p<br><fontcolor=red>RunningBall</font>','哥伦比亚甲组联赛-附加赛','71444','71443','小巴兰哈拉','卡利阿美利加','H'];
_.gm['3014642']=['12-03<br>07:00p<br><fontcolor=red>RunningBall</font>','墨西哥乙组联赛乙级-附加赛','73606','73605','可约特斯','亚玛坎','H'];
_.gm['3011132']=['12-03<br>07:00p<br><fontcolor=red>RunningBall</font>','阿根廷联邦联赛A','72908','72907','道格拉斯海格','斯伯迪沃贝尔格拉诺','H'];
_.gm['3011136']=['12-03<br>07:00p<br><fontcolor=red>RunningBall</font>','阿根廷联邦联赛A','72914','72913','拉斯佩瑞加斯','尤尼昂桑察勒斯','H'];";
$reg="/_.gm[['"s]+(d+)[s"']]+[['"s=]+([d-]+<br>[d:a-zA-Z]+)<br><font[^>]*>((?:(?!</font>)[sS])+)</font>[,'"s]+([^'",]+)[,'"s]+([^'",]+)[,'"s]+([^'",]+)[,'"s]+([^'",]+)[,'"s]+([^'",]+)[^]]+]/i";
preg_match_all($reg,$str,$mat);
$arr=array('有用信息id','时间','RB','名称','主队id','客队id','主队名称','客队名称');
for($j=0;$j<count($mat[0]);$j++){
for($i=1;$i<count($mat);$i++){
$tmp=$mat[$i][$j];
$tmp=preg_replace('/<br>/i','',$tmp);
echo($arr[$i-1].':'.$tmp." ");
}
echo("=============================== ");
}
?>
⑸ JSON序列化问题
建立实体类,直接将json字符串序列化成对象,不需要二次序列化,
{"funcname":"add","args":{"a":19,"b":"1","c":""}}
haojson点com/json2csharp/这个可以将json字符串生成对应实体类
⑹ JSON 序列化和反序列化是什么意思
序列化主要就是为了传输方便,将要传输的对象序列化为二进制的数据流,效率极高,接收时通过反序列化转化成对象,从而达到一个传输的效果
⑺ android 如何用json传递文件
先发现json可以直接传递个Object对象。开始时打算将文件读取成byte[]数组,然后再将byte转换为object来传递。通过如下方法[*]public Object toObject (byte[] bytes) { [*] Object obj = null; [*] try { [*] ByteArrayInputStream bis = new ByteArrayInputStream (bytes); [*] ObjectInputStream ois = new ObjectInputStream (bis); [*] obj = ois.readObject(); [*] ois.close(); [*] bis.close(); [*] } catch (IOException ex) { [*] ex.printStackTrace(); [*] } catch (ClassNotFoundException ex) { [*] ex.printStackTrace(); [*] } [*] return obj; [*] } 但测试发现调用这个函数时发生错误java.io.StreamCorruptedException,不知道为什么。而后又想能不能直接传递个File对象,例如:File file = new File(xxx);jsObj.put("key", file);File file2 = jsObj.get("key");请问这样这样能不能行通?因为发现很多跨进程传递对象数据都必须要求对象是序列化的。所以此处很疑惑通过json方法是否也需要这个File对象要序列化什么的。
⑻ Android Gson 使用详解
Json 是一种文本形式的数据交换格式,比 xml 更为轻量。Json 的解析和生成的方式很多,在 Android 平台上最常用的类库有 Gson 和 FastJson 两种,这里要介绍的是 Gson
Gson 的 GitHub 主页点击这里: Gson
在进行序列化与反序列操作前,需要先实例化一个 com .google.gson.Gson 对象,获取 Gson 对象的方法有两种
利用 Gson 可以很方便地生成 Json 字符串,通过使用 addProperty 的四个重载方法
addProperty 方法底层调用的是 add(String property, JsonElement value) 方法,即将基本数据类型转化为了 JsonElement 对象,JsonElement 是一个抽象类,而 JsonObject 继承了 JsonElement ,因此我们可以通过 JsonObject 自己来构建一个 JsonElement
Json数组 与 字符串数组
Json数组 与 List
Gson 也提供了 toJson() 和 fromJson() 两个方法用于转化 Model 与 Json,前者实现了序列化,后者实现了反序列化
首先,声明一个 User 类
序列化的方法很简单,调用 gson 对象的 toJson 方法,传入要序列化的对象
反序化的方式也类似
继续使用上一节声明的 User 类,根据 User 类声明的各个属性名,移动端的开发者希望接口返回的数据格式即是如下这样的
如果没有和服务器端沟通好或者是 API 改版了,接口返回的数据格式可能是这样的
如果继续使用上一节介绍的方法,那无疑会解析出错
例如
name 属性值解析不到,所以为 null
此时为了兼顾多种格式的数据,就需要使用 SerializedName 注解
根据 SerializedName 的声明来看,SerializedName 包含两个属性值,一个是字符串,一个是字符串数组,而字符串数组含有默认值
SerializedName 的作用是为了在序列化或反序列化时,指导 Gson 如果将原有的属性名和其它特殊情况下的属性名联系起来
例如,修改 User 类,为 name 声明 SerializedName 注解,注解值为 userName
在序列时,Json 格式就会相应改变
在反序列化时也一样,能够解析到正确的属性值
还有个问题没解决,为了应对多种属性名不一致的情况,难道我们要声明多个 User 类吗?这显然是不现实的,所以还需要为 User 类设置多个备选属性名,这就需要用到 SerializedName 注解的另一个属性值 alternate 了。
以下几种情况都能够被正确的反序列化
有时候并不是所有的字段都需要进行系列化和反序列化,因此需要对某些字段进行排除,有四种方法可以来实现这种需求。
Expose 注解包含两个属性值,且均声明了默认值。Expose 的含义即为“暴露”,即用于对外暴露字段,serialize 用于指定是否进行序列化,deserialize 用于指定是否进行反序列化。如果字段不声明 Expose 注解,则意味着不进行序列化和反序列化操作,相当于两个属性值均为 false 。此外,Expose 注解需要和 GsonBuilder 构建的 Gson 对象一起使用才能生效。
Expose 注解的注解值声明情况有四种
现在来看个例子,修改 User 类
按照如上的注解值,只有声明了 Expose 注解且 serialize 值为 true 的字段才能被序列化,只有声明了 Expose 注解且 deserialize 值为 true 的字段才能被反序列化
Gson 提供了 @Since 和 @Until 两个注解基于版本对字段进行过滤,@Since 和 @Until 都包含一个 Double 属性值,用于设置版本号。Since 的意思是“自……开始”,Until 的意思是“到……为止”,一样要和 GsonBuilder 配合使用。
当版本( GsonBuilder 设置的版本) 大于或等于 Since 属性值或小于 Until 属性值时字段会进行序列化和反序列化操作,而没有声明注解的字段都会加入序列化和反序列操作
现在来看个例子,修改 User 类
访问修饰符由 java.lang.reflect.Modifier 提供 int 类型的定义,而 GsonBuilder 对象的 excludeFieldsWithModifiers 方法接收一个 int 类型可变参数,指定不进行序列化和反序列化操作的访问修饰符字段
看个例子
GsonBuilder 类包含 setExclusionStrategies(ExclusionStrategy... strategies) 方法用于传入不定长参数的策略方法,用于直接排除指定字段名或者指定字段类型
看个例子
字段名为 "intField" 和字段类型为 double 的字段都会被排除掉
setExclusionStrategies 方法在序列化和反序列化时都会生效,如果只是想指定其中一种情况下的排除策略或分别指定排除策略,可以改为使用以下两个方法
对于 Gson 而言,在序列化时如果某个属性值为 null 的话,那么在序列化时该字段不会参与进来,如果想要显示输出该字段的话,可以通过 GsonBuilder 进行配置
默认的序列化后的 Josn 字符串并不太直观,可以选择格式化输出
Gson 也可以对时间值进行格式化
TypeAdapter 是一个泛型抽象类,用于接管某种类型的序列化和反序列化过程,包含两个抽象方法,分别用于自定义序列化和反序列化过程
下面看个简单的例子
定义 TypeAdapter 的子类 UserTypeAdapter 来接管 User 类的序列化和反序列化过程
这里设定当 User 类序列化时 Json 中的Key值都是大写字母开头,反序列化时支持“name”和“Name”两种不同的 Json 风格
可以看到 User 类按照预定义的策略来完成序列化和反序列化了
TypeAdapter 将序列化和反序列操作都接管了过来,其实 Gson 还提供了只接管序列化过程的接口,即 JsonSerializer
看个例子
相对应的,JsonDeserializer 接口提供了反序列化的接口
这里有个比较麻烦的地方,那就是在使用 TypeAdapter 、JsonSerializer 和 JsonDeserializer 时,总需要调用 registerTypeAdapter 方法进行注册,那有没有更简单的注册方法呢?
有的,Gosn 还提供了另一个注解 @JsonAdapter 用于进行简单的声明
类似于这样,声明了 User 类的序列化或反序列化操作由 UserTypeAdapter 完成,注解的优先级高于 registerTypeAdapter 方法
TypeAdapterFactory 是用于创建 TypeAdapter 的工厂类,通过参数 TypeToken 来查找确定对应的 TypeAdapter,如果没有就返回 null 并由 Gson 默认的处理方法来进行序列化和反序列化操作,否则就由用户预定义的 TypeAdapter 来进行处理
这一篇文章好像写得太长了一点?Gson 的知识点介绍到这里也差不多了,以后如果还发现新内容的话我会继续补充,现在就先这样啦
⑼ Android开发中为什么很少使用JSON存储数据
是可以用JSON存储数据对象的,而且也是Google推荐的,可以取代以实现Serializable来存储对象的方法。下面是使用JSON存储数据的原因。
Android开发中,涉及到对象存储,通常的做法是直接实现`Serializable`。有关这个接口,它保证了实现该接口的类的对象能够被`ObjectOutput/InputStream`直接输入输出,即序列化。这很方便,但是也很不好。
提到‘序列化’,大多数人都想到`Serializable`,而实际上‘序列化’的只是指“将对象的状态信息转换为可以存储或传输的形式的过程”,Java的`Serializabe`是字节序列化的一种。
`Serialziable`的缺点之一是,实现了该接口的类将失去灵活性。这一点《Effective Java》第74条也指出了,实现了这个`Serializable`的类将会依赖这个类的内部演化,根源在于UID(Serial version UID)。如果你没有指定UID,那么每次这个类被序列化时都会根据这个类的当前状态生成一个UID。想象这么一种场景:这个类已经被导出了,比如发给其他公司或部门使用了,然后你又修改了这个类,那么当你再将这个类发布时,由于UID不同,其他公司或部门的程序员将可能得到一个“InvalidClassException”。
这种情况的根本原因是因为你不能控制序列化的实现,你控制不了UID的生成过程。这就需要一个自定义的序列化形式。在Android中,Google推荐JSON序列化。而且Android程序员也可以使用Gson等工具来进行序列化和反序列化。
和`Serializable`的字节序列化不同,JSON序列化是字符序列化。
此外,`Serializable`只适合存储对象。由于在传输时`Serializalbe`要做大量IO,Android提供了`Parcelable`。
最后,题主不应该把数据库和JSON,XML比较,如果要比,也只能把数据库和文件存储比。数据库适合存储数量大,关系复杂的数据,这样管理,查阅就很方便。与此相对文件存储适合数量小,关系简单的数据。
⑽ 怎么json序列化出来,不是用引用,直接序列化具体的值
eturn Newtonsoft.Json.JsonConvert.SerializeObject(testSchme); 序列化的时候便报这个错。但是当我把该对象的其中一个集合属性赋值为null的时候,就可以序列化了。 testS