Android 开发中为什么很少使用 JSON 存储数据库存储过程的使用

在Android中操作JSON数据
视频太卡?试试切换线路
JSON:JavaScript 对象表示法(JavaScript Object Notation)。独立于语言和平台,比 XML 更小、更快,更易解析。本课时介绍JSON数据格式。
Android平台自带了JSON解析的相关API,可以将文件、输入流中的数据转化为JSON对象,然后从对象中获取JSON保存的数据内容。本课时讲解读取JSON格式数据。
Android平台自带了JSON构造的相关API,可以轻松地构造JSON对象、JSON数组,并且为他们赋值,而且很容易将JSON对象转换为字符串用于传播。本课时讲解创建JSON格式数据。
只有成为VIP会员才能提问&回复,快吧!如果你还没有账号你可以一个账号。
添加新技术问题
课程 [JSON数据格式简介]
中已存在问题
添加新技术问题
问题描述越详细,被解答的速度越快
有新回答时请邮件提醒我
着急,拜托快点
不急,慢慢解决
关联课程 [JSON数据格式简介]以前就用过json串,不过是在java环境下面,如今转移到android环境下,java里面生成解析json串的jar包与android中自带的冲突,所以也只能用安卓自带的。
先前查网上的资料,感觉很多都说的很乱,直接给出了例子,也不解释一下就算完成,他们自己肯定是明白的,但是让读者理解起来肯定有点难度。而且解析的方法很多,而这里,我就介绍一种最原始最简单的吧。希望我拙劣的表达能力不会影响到你们的理解。
首先我们先讲一下json串格式
比如对象pet(宠物)
class pet{
那么对象的json串形式就是
{"pet":[{"petid":1000,"petname":"name1","pettype":"type1"}]}
而如果我们创建多个pet对象,那么字符串形式就为:
{"pet":[{"petid":1000,"petname":"name1","pettype":"type1"},{"petid":1002,"petname":"name2","pettype":"type2"}]}
这里定义的如果是int型,值就不要添加"号,如果String类型或者其他类型,则添加"。
一、生成json串
好了,下面我们来利用android自带的JSONObject来创建一个json字符串。
&span style="font-size:18px"&public String petToJson(Pet pet) { &
& & & & String jsonresult = "";//定义返回字符串 &
& & & & JSONObject object = new JSONObject();//创建一个总的对象,这个对象对整个json串 &
& & & & try { &
& & & & & & JSONArray jsonarray = new JSONArray();//json数组,里面包含的内容为pet的所有对象 &
& & & & & & JSONObject jsonObj = new JSONObject();//pet对象,json形式 &
& & & & & & jsonObj.put("petid", pet.getPetid());//向pet对象里面添加值 &
& & & & & & jsonObj.put("petname", pet.getPetname()); &
& & & & & & jsonObj.put("pettype", pet.getPettype()); &
& & & & & & // 把每个数据当作一对象添加到数组里 &
& & & & & & jsonarray.put(jsonObj);//向json数组里面添加pet对象 &
& & & & & & object.put("pet", jsonarray);//向总对象里面添加包含pet的数组 &
& & & & & & & & & & & & jsonresult = object.toString();//生成返回字符串 &
& & & & } catch (JSONException e) { &
& & & & & & // TODO Auto-generated catch block &
& & & & & & e.printStackTrace(); &
& & & & } &
& & & & LogI("生成的json串为:"+jsonresult); &
& & }&/span& &
最后生成结果为:{"pet":[{"petid":100,"petname":"name1","pettype":"type1"}]}
当然,如果我们想生成多个对象,那么只需要多调用几次
&span style="font-size:18px"&jsonarray.put(jsonObj);//向json数组里面添加pet对象&/span& &
这个方法就可以了。
另外对于最外层的object我们可以这样去理解,实际上我们生成的是
这样的类型,只不过最外面的object我们看不到而已。
二、解析json串
其实解析和生成是相对应的,怎么样生成的,那么就应该怎么样返过来解析
传入的json={"pet":[{"petid":100,"petname":"name1","pettype":"type1"}]}
&span style="font-size:18px"&public Pet jsonToPet(String json){ &
& & & & if(json.startsWith("error")){//这里可以做一下检测,如果不是json格式的就直接返回 &
& & & & & & &
& & & & } &
& & & & Pet pet=new Pet();//准备返回的pet对象 &
& & & & try { &
& & & & & & JSONObject jsonObject=new JSONObject(json);//我们需要把json串看成一个大的对象 &
& & & & & & JSONArray jsonArray=jsonObject.getJSONArray("pet");//这里获取的是装载有所有pet对象的数组 &
& & & & & & JSONObject jsonpet = jsonArray.getJSONObject(0);//获取这个数组中第一个pet对象 &
& & & & & & &&
& & & & & & String petid=jsonpet.getString("petid");//获取pet对象的参数 &
& & & & & & String petname=jsonpet.getString("petname"); &
& & & & & & String pettype=jsonpet.getString("pettype"); &
& & & & & & &&
& & & & & & pet.setPetid(petid);//把参数添加到pet对象当中。 &
& & & & & & pet.setPetid(petname); &
& & & & & & pet.setPetid(pettype); &
& & & & } catch (JSONException e) { &
& & & & & & e.printStackTrace(); &
& & & & } &
& & & & LogI("json To Pet:"+pet.toString());//打印出pet对象参数。 &
& & }&/span& &
其实json串的解析是很简单的,当然本文章中我之举了一个最简单的例子。实际应用中传入的json串并不是标准的。有可能是:[{"petid":100,"petname":"name1","pettype":"type1"}]这样的,那么对于这样的很明显这是一个数组形式,那么我们就直接用
&span style="font-size:18px"&JSONArray jsonArray=new &/span&&span style="font-size:18px"&JSONArray&/span&&span style="font-size:18px"&(json);&/span& &
来解析就可以了。
当然具体的形式还有很多种,但是我们只要分清对象和数组这个相互包含的概念,就一定能够解析出来。
转载:/kf/866.html
阅读(...) 评论()Android 开发者应该使用 FlatBuffers 替代 JSON ?
你可能会问,既然我们已经有很标准的JSON以及转换库比如GSON和Jackson,为什么还要使用新的工具呢?不妨先试一下FlatBuffers,然后你就会发现它比JSON快得多。FlatBuffers是什么?是一个高效的跨平台序列化类库,可以在C++、C#、C、Go、Java、JavaScript、PHP和Python中使用。是Google开发的,是为了应用在游戏开发,以及其他注重性能的应用上。为什么要使用FlatBuffers?不需要解析/拆包就可以访问序列化数据 — FlatBuffers与其他库不同之处就在于它使用二进制缓冲文件来表示层次数据,这样它们就可以被直接访问而不需解析与拆包,同时还支持数据结构进化(前进、后退兼容性)。内存高效速度快 —
访问数据时只需要访问内存中的缓冲区。它不需要多余的内存分配(至少在C++是这样,其他语言中可能会有变动)。FlatBuffers还适合配合
mmap或数据流使用,只需要缓冲区的一部分存储在内存中。访问时速度接近原结构访问,只有一点延迟(一种虚函数表vtable),是为了允许格式升级以
及可选字段。FlatBuffers适合那些花费了大量时间和空间(内存分配)来访问和构建序列化数据的项目,比如游戏以及其他对表现敏感的应用。可以参
考这里的。灵活 — 由于有可选字段,你不但有很强的升级和回退兼容性(对于历史悠久的游戏尤其重要,不用为了每个版本升级所有数据),在选择要存储哪些数据以及设计数据结构时也很自由。轻量的code footprint — FlatBuffers只需要很少量的生成代码,以及一个表示最小依赖的很小的头文件,很容易集成。细节上可以看上面的基准页。强类型 — 编译时报错,而不需要自己写重复的容易出错的运行时检查。它可以自动生成有用的代码。使用方便 — 生成的C++代码允许精简访问与构建代码。还有可选的用于实现图表解析、类似JSON的运行时字符串展示等功能的方法。(后者比JSON解析库更快,内存效率更高)代码跨平台且没有依赖 — C++代码可以运行在任何近代的gcc/clang和VS2010上。同时还有用于测试和范例的构建文件(Android中.mk文件,其他平台是cmake文件)。都有谁使用FlatBuffers?,印度第一贴图App。我们在BobbleApp中使用FlatBuffers后App的性能明显增强。,第一开源移动游戏引擎,使用FlatBuffers来序列化所有的游戏数据。Facebook使用FlatBuffers在Android App中进行客户端服务端的沟通。他们写了一篇来描述FlatBuffers是如何加速加载内容的。Google的在他们所有的库和游戏中大量使用FlatBuffers。App性能有多大提高?解析速度 解析一个20KB的JSON流(这差不多是BobbleApp的返回大小)需要35ms,超过了UI刷新间隔也就是16.6ms。如果解析JSON的话,我们就在滑动时就会因为要从磁盘加载缓存而导致掉帧(视觉上的卡顿)。解析器初始化 一个JSON解析器需要先构建字段映射再进行解析,这会花100ms到200ms,很明显的拖缓App启动时间。垃圾回收 在解析JSON时创建了很多小对象,在我们的试验中,解析20kb的JSON流时,要分配大约100kb的瞬时存储,对Java内存回收造成很大压力。FlatBuffers vs JSON我尝试使用FlatBuffers和JSON解析4mb的JSON文件。FlatBuffers花了1-5ms,JSON花了大约2000ms。在使用FlatBuffers期间Android App中没有GC,而在使用JSON时发生了很多次GC。在使用JSON时UI完全卡住,所以真实使用时只能在后台线程进行解析。如何使用FlatBuffer呢?我在我的GitHub中写了一个,里面手把手教你如何使用FlatBuffer。原文链接:稿源:& 作者&
转载请注明:文章转载自 开源中国社区
本文标题:Android 开发者应该使用 FlatBuffers 替代 JSON ?
本文地址:
引用来自“gzwxn”的评论恰恰相反,需要考虑大小端兼容才是极端情况。现在大端序已经是半身入土的了,相信现时正在运行的操作系统中
99% 用的都是小端序。虽说网络序是大端序,但也仅限网络协议中的几个二进制数,被传输的数据能有多少是大端序?引用来自“poseidon0000”的评论现在大端的设备绝对比小端的多,主要原因是arm,而目前几乎所有的手机,嵌入式设备都是使用的arm芯片。 引用来自“gzwxn”的评论ARM 的架构可由操作系统决定用哪种。嵌入式设备不了解,但 Android 用小端序这一点是毫无疑问的。arm确实是大小端都支持,但是默认都是用大端,我们平常开发的基本都是大端的。另外你说的android用小端是指的java虚拟机吧。
引用来自“gzwxn”的评论恰恰相反,需要考虑大小端兼容才是极端情况。现在大端序已经是半身入土的了,相信现时正在运行的操作系统中
99% 用的都是小端序。虽说网络序是大端序,但也仅限网络协议中的几个二进制数,被传输的数据能有多少是大端序?引用来自“poseidon0000”的评论现在大端的设备绝对比小端的多,主要原因是arm,而目前几乎所有的手机,嵌入式设备都是使用的arm芯片。 ARM 的架构可由操作系统决定用哪种。嵌入式设备不了解,但 Android 用小端序这一点是毫无疑问的。
引用来自“gzwxn”的评论恰恰相反,需要考虑大小端兼容才是极端情况。现在大端序已经是半身入土的了,相信现时正在运行的操作系统中
99% 用的都是小端序。虽说网络序是大端序,但也仅限网络协议中的几个二进制数,被传输的数据能有多少是大端序?现在大端的设备绝对比小端的多,主要原因是arm,而目前几乎所有的手机,嵌入式设备都是使用的arm芯片。
IDL 语言特性 跨平台 多语言支持!https://google.github.io/flatbuffers/md__java_usage.html
引用来自“obadneil”的评论能简单介绍下原因吗引用来自“开源中国首席色情喷子”的评论根据以往经验,谷歌做出来的东西,很大可能在下个版本大改或者纯粹是玩票性质。引用来自“mgic”的评论是的,谷歌向来喜欢这么干,都是给些不成熟的东西,让人当小白鼠。是啊,谷歌向来喜欢这么干
引用来自“obadneil”的评论能简单介绍下原因吗引用来自“开源中国首席色情喷子”的评论根据以往经验,谷歌做出来的东西,很大可能在下个版本大改或者纯粹是玩票性质。是的,谷歌向来喜欢这么干,都是给些不成熟的东西,让人当小白鼠。
引用来自“gzwxn”的评论恰恰相反,需要考虑大小端兼容才是极端情况。现在大端序已经是半身入土的了,相信现时正在运行的操作系统中
99% 用的都是小端序。虽说网络序是大端序,但也仅限网络协议中的几个二进制数,被传输的数据能有多少是大端序?引用来自“乌龟壳”的评论实际上没有二进制协议解析的代码,会假设机器是大端还是小端的,全部都要用一些位操转一下。除非是给自己项目开发的特殊代码,或者给特殊设备开发的代码,为了性能,网络上的协议实际和设备同一字节序。json有一个变种就是bson,为的就是减轻解码字符串的负担,很多数据结构都用二进制协议替换字符串协议。
引用来自“gzwxn”的评论恰恰相反,需要考虑大小端兼容才是极端情况。现在大端序已经是半身入土的了,相信现时正在运行的操作系统中
99% 用的都是小端序。虽说网络序是大端序,但也仅限网络协议中的几个二进制数,被传输的数据能有多少是大端序?实际上没有二进制协议解析的代码,会假设机器是大端还是小端的,全部都要用一些位操转一下。除非是给自己项目开发的特殊代码,或者给特殊设备开发的代码,为了性能,网络上的协议实际和设备同一字节序。
恰恰相反,需要考虑大小端兼容才是极端情况。现在大端序已经是半身入土的了,相信现时正在运行的操作系统中
99% 用的都是小端序。虽说网络序是大端序,但也仅限网络协议中的几个二进制数,被传输的数据能有多少是大端序?
引用来自“obadneil”的评论能简单介绍下原因吗根据以往经验,谷歌做出来的东西,很大可能在下个版本大改或者纯粹是玩票性质。
能简单介绍下原因吗Android 开发中为什么很少使用 JSON 存储数据? - 知乎140被浏览9952分享邀请回答81 条评论分享收藏感谢收起9添加评论分享收藏感谢收起查看更多回答

我要回帖

更多关于 hdfs数据存储 的文章

 

随机推荐