" />

小言_互联网的博客

你所不知道的XML与JSON

372人阅读  评论(0)

一、XML:

XML(Extensible Markup Language 可扩展标记语言),XML是一个以文本来描述数据的文档。

1. 示例:


  
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <people>
  3. <person personid="E01">
  4. <name>Tony </name>
  5. <address>10 Downing Street, London, UK </address>
  6. <tel>(061) 98765 </tel>
  7. <fax>(061) 98765 </fax>
  8. <email>tony@everywhere.com </email>
  9. </person>
  10. <person personid="E02">
  11. <name>Bill </name>
  12. <address>White House, USA </address>
  13. <tel>(001) 6400 98765 </tel>
  14. <fax>(001) 6400 98765 </fax>
  15. <email>bill@everywhere.com </email>
  16. </person>
  17. </people>

2. 用途:

(1)充当显示数据(以XML充当显示层)

(2)存储数据(存储层)的功能

(3)以XML描述数据,并在联系服务器与系统的其余部分之间传递。(传输数据的一样格式)

从某种角度讲,XML是数据封装和消息传递技术。

3.解析XML:

3.1 :使用SAX解析XML

3.1.1 什么是SAX:

SAX是Simple API for XML的缩写
SAX 是读取和操作 XML 数据更快速、更轻量的方法。SAX 允许您在读取文档时处理它,从而不必等待整个文档被存储之后才采取操作。它不涉及 DOM 所必需的开销和概念跳跃。 SAX API是一个基于事件的API ,适用于处理数据流,即随着数据的流动而依次处理数据。SAX API 在其解析您的文档时发生一定事件的时候会通知您。在您对其响应时,您不作保存的数据将会被抛弃。

3.1.2 SAX解析XML方式:

SAX API中主要有四种处理事件的接口,它们分别是ContentHandler,DTDHandler, EntityResolver 和 ErrorHandler 。实际上只要继承DefaultHandler 类就可以,DefaultHandler实现了这四个事件处理器接口,然后提供了每个抽象方法的默认实现。


  
  1. // 创建SAX解析器工厂对象
  2. SAXParserFactory spf = SAXParserFactory.newInstance();
  3. // 使用解析器工厂创建解析器实例
  4. SAXParser saxParser = spf.newSAXParser();
  5. // 创建SAX解析器要使用的事件侦听器对象
  6. PersonHandler handler = 
  7.                           new PersonHandler();
  8. // 开始解析文件
  9. saxParser.parse(
  10.             new File(fileName), handler);

3.2. DOM解析XML:

DOM:Document Object Model(文档对象模型)
DOM的特性:
定义一组 Java 接口,基于对象,与语言和平台无关将 XML 文档表示为树,在内存中解析和存储 XML 文档,允许随机访问文档的不同部分。

DOM解析XML
DOM的优点,由于树在内存中是持久的,因此可以修改后更新。它还可以在任何时候在树中上下导航,API使用起来也较简单。 


  
  1. DocumentBuilderFactory builder = DocumentBuilderFactory.newInstance();
  2. DocumentBuilder db = builder.newDocumentBuilder();
  3. db.parse( "person.xml");
  4. NodeList node_person = doc.getElementsByTagName( "person");

 3.3. JDOM解析XML:

JDOM是两位著名的 Java 开发人员兼作者,Brett Mclaughlin 和 Jason Hunter 的创作成果, 2000 年初在类似于Apache协议的许可下,JDOM作为一个开放源代码项目正式开始研发了。

JDOM 简化了与 XML 的交互并且比使用 DOM 实现更快,JDOM 与 DOM 主要有两方面不同。首先,JDOM 仅使用具体类而不使用接口。这在某些方面简化了 API,但是也限制了灵活性。第二,API 大量使用了 Collections 类,简化了那些已经熟悉这些类的 Java 开发者的使用。
 


  
  1. 解析步骤:
  2. 1)SAXBuilder sax = new SAXBuilder();
  3. 2)Document doc = sax.build(….);
  4. 3)Element el = doc.getRootElement();( 4List list = el.getChildren();
  5. 5)遍历内容

3.4. DOM4J解析XML:

dom4j是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。在对主流的Java XML API进行的性能、功能和易用性的评测,dom4j无论在那个方面都是非常出色的。如今你可以看到越来越多的Java软件都在使用dom4j来读写XML,特别值得一提的是连Sun的JAXM也在用dom4j。这是必须使用的jar包, Hibernate用它来读写配置文件。
 


  
  1. 解析步骤:
  2. 1)SAXReader sax = new SAXReader();
  3. 2)Document doc = sax.read(Thread.currentThread().getContextClassLoader()
  4. .getResourceAsStream( "person.xml"));
  5. 3)Element root = doc.getRootElement();
  6. 4)Iterator iterator = root.elementIterator();
  7. 5)遍历迭代器

4.各种解析方法比较:

JDOM 和 DOM 在性能测试时表现不佳,在测试 10M 文档时内存溢出。
SAX表现较好,这要依赖于它特定的解析方式。一个 SAX 检测即将到来的XML流,但并没有载入到内存(当然当XML流被读入时,会有部分文档暂时隐藏在内存中。DOM4J是这场测试的获胜者,目前许多开源项目中大量采用 DOM4J,例如大名鼎鼎的 Hibernate 也用 DOM4J 来读取 XML 配置文件。
xstream 实现XML的转换

5.案例:


  
  1. public class Person {
  2. private String personid;
  3. private String name;
  4. private String address;
  5. private String tel;
  6. private String fax;
  7. private String email;
  8. @Override
  9. public String toString() {
  10. return "Person{" +
  11. "personid='" + personid + '\'' +
  12. ", name='" + name + '\'' +
  13. ", address='" + address + '\'' +
  14. ", tel='" + tel + '\'' +
  15. ", fax='" + fax + '\'' +
  16. ", email='" + email + '\'' +
  17. '}';
  18. }
  19. public String getPersonid() {
  20. return personid;
  21. }
  22. public void setPersonid(String personid) {
  23. this.personid = personid;
  24. }
  25. public String getName() {
  26. return name;
  27. }
  28. public void setName(String name) {
  29. this.name = name;
  30. }
  31. public String getAddress() {
  32. return address;
  33. }
  34. public void setAddress(String address) {
  35. this.address = address;
  36. }
  37. public String getTel() {
  38. return tel;
  39. }
  40. public void setTel(String tel) {
  41. this.tel = tel;
  42. }
  43. public String getFax() {
  44. return fax;
  45. }
  46. public void setFax(String fax) {
  47. this.fax = fax;
  48. }
  49. public String getEmail() {
  50. return email;
  51. }
  52. public void setEmail(String email) {
  53. this.email = email;
  54. }
  55. }

 


  
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <people>
  3. <person personid="E01">
  4. <name>Tony Blair </name>
  5. <address>10 Downing Street, London, UK </address>
  6. <tel>(061) 98765 </tel>
  7. <fax>(061) 98765 </fax>
  8. <email>blair@everywhere.com </email>
  9. </person>
  10. <person personid="E02">
  11. <name>Bill Clinton </name>
  12. <address>White House, USA </address>
  13. <tel>(001) 6400 98765 </tel>
  14. <fax>(001) 6400 98765 </fax>
  15. <email>bill@everywhere.com </email>
  16. </person>
  17. </people>

 


  
  1. import org.xml.sax.Attributes;
  2. import org.xml.sax.SAXException;
  3. import org.xml.sax.helpers.DefaultHandler;
  4. import java.util.ArrayList;
  5. import java.util.List;
  6. /**
  7. * Created by Hu Guanzhong
  8. * SAX解析的特点:
  9. * 1、基于事件驱动
  10. * 2、顺序读取,速度快
  11. * 3、不能任意读取节点(灵活性差)
  12. * 4、解析时占用的内存小
  13. * 5、SAX更适用于在性能要求更高的设备上使用(Android开发中)
  14. *
  15. */
  16. public class PersonHandler extends DefaultHandler{
  17. private List<Person> persons = null;
  18. private Person p; //当前正在解析的person
  19. private String tag; //用于记录当前正在解析的标签名
  20. public List<Person> getPersons() {
  21. return persons;
  22. }
  23. //开始解析文档时调用
  24. @Override
  25. public void startDocument() throws SAXException {
  26. super.startDocument();
  27. persons = new ArrayList<>();
  28. System.out.println( "开始解析文档...");
  29. }
  30. //在XML文档解析结束时调用
  31. @Override
  32. public void endDocument() throws SAXException {
  33. super.endDocument();
  34. System.out.println( "解析文档结束.");
  35. }
  36. /**
  37. * 解析开始元素时调用
  38. * @param uri 命名空间
  39. * @param localName 不带前缀的标签名
  40. * @param qName 带前缀的标签名
  41. * @param attributes 当前标签的属性集合
  42. * @throws SAXException
  43. */
  44. @Override
  45. public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
  46. super.startElement(uri, localName, qName, attributes);
  47. if ( "person".equals(qName)){
  48. p = new Person();
  49. String personid = attributes.getValue( "personid");
  50. p.setPersonid(personid);
  51. }
  52. tag = qName;
  53. System.out.println( "startElement--"+qName);
  54. }
  55. //解析结束元素时调用
  56. @Override
  57. public void endElement(String uri, String localName, String qName) throws SAXException {
  58. super.endElement(uri, localName, qName);
  59. if ( "person".equals(qName)) {
  60. persons.add(p);
  61. }
  62. tag = null;
  63. System.out.println( "endElement--"+qName);
  64. }
  65. //解析文本内容时调用
  66. @Override
  67. public void characters(char[] ch, int start, int length) throws SAXException {
  68. super.characters(ch, start, length);
  69. if (tag != null) {
  70. if ( "name".equals(tag)) {
  71. p.setName( new String(ch,start,length));
  72. } else if( "address".equals(tag)){
  73. p.setAddress( new String(ch,start,length));
  74. } else if( "tel".equals(tag)){
  75. p.setTel( new String(ch,start,length));
  76. } else if( "fax".equals(tag)){
  77. p.setFax( new String(ch,start,length));
  78. } else if( "email".equals(tag)){
  79. p.setEmail( new String(ch,start,length));
  80. }
  81. System.out.println(ch);
  82. }
  83. }
  84. }

 


  
  1. public class XMLDemo {
  2. /**
  3. * 使用第三方xstream组件实现XML的解析与生成
  4. */
  5. @Test
  6. public void xStream(){
  7. Person p = new Person();
  8. p.setPersonid( "1212");
  9. p.setAddress( "北京");
  10. p.setEmail( "vince@163.com");
  11. p.setFax( "6768789798");
  12. p.setTel( "13838389438");
  13. p.setName( "38");
  14. XStream xStream = new XStream( new Xpp3Driver());
  15. xStream.alias( "person",Person.class);
  16. xStream.useAttributeFor(Person.class, "personid");
  17. String xml = xStream.toXML(p);
  18. System.out.println(xml);
  19. //解析XML
  20. Person person = (Person)xStream.fromXML(xml);
  21. System.out.println(person);
  22. }
  23. /**
  24. * 从XML文件中读取对象
  25. */
  26. @Test
  27. public void xmlDecoder() throws FileNotFoundException {
  28. BufferedInputStream in = new BufferedInputStream( new FileInputStream( "test.xml"));
  29. XMLDecoder decoder = new XMLDecoder(in);
  30. Person p = (Person)decoder.readObject();
  31. System.out.println(p);
  32. }
  33. /**
  34. * 把对象转成XML文件写入
  35. */
  36. @Test
  37. public void xmlEncoder() throws FileNotFoundException {
  38. BufferedOutputStream bos = new BufferedOutputStream( new FileOutputStream( "test.xml"));
  39. XMLEncoder xmlEncoder = new XMLEncoder(bos);
  40. Person p = new Person();
  41. p.setPersonid( "1212");
  42. p.setAddress( "北京");
  43. p.setEmail( "vince@163.com");
  44. p.setFax( "6768789798");
  45. p.setTel( "13838389438");
  46. p.setName( "38");
  47. xmlEncoder.writeObject(p);
  48. xmlEncoder.close();
  49. }
  50. /**
  51. * DOM4J解析XML
  52. * 基于树型结构,第三方组件
  53. * 解析速度快,效率更高,使用的JAVA中的迭代器实现数据读取,在WEB框架中使用较多(Hibernate)
  54. *
  55. */
  56. @Test
  57. public void dom4jParseXML() throws DocumentException {
  58. //1 创建DOM4J的解析器对象
  59. SAXReader reader = new SAXReader();
  60. InputStream is = Thread.currentThread().getContextClassLoader()
  61. .getResourceAsStream( "com/vince/xml/person.xml");
  62. org.dom4j.Document doc = reader.read(is);
  63. org.dom4j.Element rootElement = doc.getRootElement();
  64. Iterator<org.dom4j.Element> iterator = rootElement.elementIterator();
  65. ArrayList<Person> persons = new ArrayList<>();
  66. Person p = null;
  67. while(iterator.hasNext()){
  68. p = new Person();
  69. org.dom4j.Element e = iterator.next();
  70. p.setPersonid(e.attributeValue( "personid"));
  71. Iterator<org.dom4j.Element> iterator1 = e.elementIterator();
  72. while(iterator1.hasNext()){
  73. org.dom4j.Element next = iterator1.next();
  74. String tag = next.getName();
  75. if( "name".equals(tag)){
  76. p.setName(next.getText());
  77. } else if( "address".equals(tag)){
  78. p.setAddress(next.getText());
  79. } else if( "tel".equals(tag)){
  80. p.setTel(next.getText());
  81. } else if( "fax".equals(tag)){
  82. p.setFax(next.getText());
  83. } else if( "email".equals(tag)){
  84. p.setEmail(next.getText());
  85. }
  86. }
  87. persons.add(p);
  88. }
  89. System.out.println( "结果:");
  90. System.out.println(Arrays.toString(persons.toArray()));
  91. }
  92. /**
  93. * JDOM解析 XML
  94. * 1、与DOM类似基于树型结构,
  95. * 2、与DOM的区别:
  96. * (1)第三方开源的组件
  97. * (2)实现使用JAVA的Collection接口
  98. * (3)效率比DOM更快
  99. */
  100. @Test
  101. public void jdomParseXML() throws JDOMException, IOException {
  102. //创建JDOM解析器
  103. SAXBuilder builder = new SAXBuilder();
  104. InputStream is = Thread.currentThread().getContextClassLoader()
  105. .getResourceAsStream( "com/vince/xml/person.xml");
  106. org.jdom2.Document build = builder.build(is);
  107. Element rootElement = build.getRootElement();
  108. List<Person> list = new ArrayList<>();
  109. Person person = null;
  110. List<Element> children = rootElement.getChildren();
  111. for(Element element: children){
  112. person = new Person();
  113. String personid = element.getAttributeValue( "personid");
  114. person.setPersonid(personid);
  115. List<Element> children1 = element.getChildren();
  116. for (Element e: children1){
  117. String tag = e.getName();
  118. if( "name".equals(tag)){
  119. person.setName(e.getText());
  120. } else if( "address".equals(tag)){
  121. person.setAddress(e.getText());
  122. } else if( "tel".equals(tag)){
  123. person.setTel(e.getText());
  124. } else if( "fax".equals(tag)){
  125. person.setFax(e.getText());
  126. } else if( "email".equals(tag)){
  127. person.setEmail(e.getText());
  128. }
  129. }
  130. list.add(person);
  131. }
  132. System.out.println( "结果:");
  133. System.out.println(Arrays.toString(list.toArray()));
  134. }
  135. /**
  136. * DOM解析XML
  137. * 1、基于树型结构,通过解析器一次性把文档加载到内存中,所以会比较占用内存,可以随机访问
  138. * 更加灵活,更适合在WEB开发中使用
  139. */
  140. @Test
  141. public void domParseXML() throws ParserConfigurationException, IOException, SAXException {
  142. //1、创建一个DOM解析器工厂对象
  143. DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
  144. //2、通过工厂对象创建解析器对象
  145. DocumentBuilder documentBuilder = factory.newDocumentBuilder();
  146. //3、解析文档
  147. InputStream is = Thread.currentThread().getContextClassLoader()
  148. .getResourceAsStream( "com/vince/xml/person.xml");
  149. //此代码完成后,整个XML文档已经被加载到内存中,以树状形式存储
  150. Document doc = documentBuilder.parse(is);
  151. //4、从内存中读取数据
  152. //获取节点名称为person的所有节点,返回节点集合
  153. NodeList personNodeList = doc.getElementsByTagName( "person");
  154. ArrayList<Person> persons = new ArrayList<>();
  155. Person p = null;
  156. //此循环会迭代两次
  157. for ( int i= 0;i<personNodeList.getLength();i++){
  158. Node personNode = personNodeList.item(i);
  159. p = new Person();
  160. //获取节点的属性值
  161. String personid = personNode.getAttributes().getNamedItem( "personid").getNodeValue();
  162. p.setPersonid(personid);
  163. //获取当前节点的所有子节点
  164. NodeList childNodes = personNode.getChildNodes();
  165. for ( int j = 0;j<childNodes.getLength();j++){
  166. Node item = childNodes.item(j);
  167. String nodeName = item.getNodeName();
  168. if ( "name".equals(nodeName)) {
  169. p.setName(item.getFirstChild().getNodeValue());
  170. } else if( "address".equals(nodeName)){
  171. p.setAddress(item.getFirstChild().getNodeValue());
  172. } else if( "tel".equals(nodeName)){
  173. p.setTel(item.getFirstChild().getNodeValue());
  174. } else if( "fax".equals(nodeName)){
  175. p.setFax(item.getFirstChild().getNodeValue());
  176. } else if( "email".equals(nodeName)){
  177. p.setEmail(item.getFirstChild().getNodeValue());
  178. }
  179. }
  180. persons.add(p);
  181. }
  182. System.out.println( "结果:");
  183. System.out.println(Arrays.toString(persons.toArray()));
  184. }
  185. /**
  186. * SAX解析的特点:
  187. * 1、基于事件驱动
  188. * 2、顺序读取,速度快
  189. * 3、不能任意读取节点(灵活性差)
  190. * 4、解析时占用的内存小
  191. * 5、SAX更适用于在性能要求更高的设备上使用(Android开发中)
  192. * @throws ParserConfigurationException
  193. * @throws SAXException
  194. * @throws IOException
  195. */
  196. @Test
  197. public void saxParseXML() throws ParserConfigurationException, SAXException, IOException {
  198. //1、创建一个SAX解析器工厂对象
  199. SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
  200. //2、通过工厂对象创建SAX解析器
  201. SAXParser saxParser = saxParserFactory.newSAXParser();
  202. //3、创建一个数据处理器(需要我们自己来编写)
  203. PersonHandler personHandler = new PersonHandler();
  204. //4、开始解析
  205. InputStream is = Thread.currentThread().getContextClassLoader()
  206. .getResourceAsStream( "com/vince/xml/person.xml");
  207. saxParser.parse(is,personHandler);
  208. List<Person> persons = personHandler.getPersons();
  209. for (Person p:persons){
  210. System.out.println(p);
  211. }
  212. }
  213. }

二、JSON:

1. 示例:

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 JSON 官方:http://www.json.org 
JSON 数据格式的特点
JSON 建构于两种结构:
1、 “名称/值”对的集合 
2.、 值的有序列表(数组)


  
  1. JSON 表示名称 / 值对的方式 :
  2. { "firstName": "vince", "lastName": "ma", "email": "finally_m@foxmail.com"
  3. 表示数组
  4. { "user": { "firstName": "vince", "lastName": "ma", "email": "finally_m@foxmail.com" }, 
  5. { "firstName": "lin", "lastName": "jacks", "email": “jacks@qq.com”}]

2. 使用GSON解析JSON:


  
  1. //GSON是Google开发的Java API,用于转换Java对象和Json对象。
  2. //下载地址:http://www.mvnrepository.com/artifact/com.google.code.gson/gson
  3. //解析JSON:
  4. JsonReader reader = new JsonReader( new StringReader(jsonData));
  5. //生成JSON:
  6. private String createJSON(ArrayList<User> users) {
  7. JSONObject jsonObject = new JSONObject();JSONArray array = new JSONArray();
  8. int size = users.size();
  9. try { for ( int i = 0; i < size; i++) {
  10. User user = users.get(i); JSONObject object = new JSONObject();
  11. object.put( "name", user.name);object.put( "age", user.age);array.put(object);}
  12. jsonObject.put( "users",array);
  13. return jsonObject.toString();
  14. } catch (JSONException e) {e.printStackTrace();}
  15. return null;
  16. }
  17. static class User {String name; int age; //…}
  18. //使用 Gson 直接把 JSON 数据转换成 Java 对象
  19. public Student parserJSON2(String data){
  20. Gson gson = new Gson();
  21. Student s = gson.fromJson(data, Student.class);
  22. return s;
  23. }
  24. //使用 Gson 直接把 JSON 数组转换成 Java 对象
  25. public List<Student> parserJSON3(String data){
  26. Type type = new TypeToken<ArrayList<Student>>(){}.getType();
  27. Gson gson = new Gson();
  28. List<Student> list = gson.fromJson(data, type);
  29. return list;
  30. }

3. 案例:


  
  1. public class JsonDemo{
  2. /**
  3. * 使用JsonReader解析复杂的JSON数据
  4. */
  5. @Test
  6. public void parseJSONMessages(){
  7. InputStream is = Thread.currentThread().getContextClassLoader()
  8. .getResourceAsStream( "message.json");
  9. InputStreamReader in = new InputStreamReader(is);
  10. JsonReader jsonReader = new JsonReader(in);
  11. ArrayList<Message> list = readMessageArray(jsonReader);
  12. for (Message m: list){
  13. System.out.println(m);
  14. }
  15. }
  16. //读取Message数组
  17. private ArrayList<Message> readMessageArray(JsonReader jsonReader) {
  18. ArrayList<Message> list = new ArrayList<>();
  19. try {
  20. jsonReader.beginArray();
  21. while(jsonReader.hasNext()){
  22. list.add(readMessage(jsonReader));
  23. }
  24. jsonReader.endArray();
  25. } catch (IOException e) {
  26. e.printStackTrace();
  27. }
  28. return list;
  29. }
  30. //解析一个Message对象
  31. private Message readMessage(JsonReader jsonReader) {
  32. Message m = new Message();
  33. try {
  34. jsonReader.beginObject();
  35. while (jsonReader.hasNext()){
  36. String name = jsonReader.nextName();
  37. if( "id".equals(name)){
  38. m.setId(jsonReader.nextLong());
  39. } else if( "text".equals(name)){
  40. m.setText(jsonReader.nextString());
  41. } else if( "geo".equals(name) && jsonReader.peek()!= JsonToken.NULL){
  42. m.setGeo(readGeo(jsonReader));
  43. } else if( "user".equals(name)){
  44. m.setUser(readUser(jsonReader));
  45. } else{
  46. jsonReader.skipValue();
  47. }
  48. }
  49. jsonReader.endObject();
  50. } catch (IOException e) {
  51. e.printStackTrace();
  52. }
  53. return m;
  54. }
  55. /**
  56. * 解析User对象
  57. * @param jsonReader
  58. * @return
  59. */
  60. private User readUser(JsonReader jsonReader) {
  61. User user = new User();
  62. try {
  63. jsonReader.beginObject();
  64. while (jsonReader.hasNext()){
  65. String name = jsonReader.nextName();
  66. if( "name".equals(name)){
  67. user.setName(jsonReader.nextString());
  68. } else if( "followers_count".equals(name)){
  69. user.setFollowers_count(jsonReader.nextInt());
  70. } else{
  71. jsonReader.skipValue();
  72. }
  73. }
  74. jsonReader.endObject();
  75. } catch (IOException e) {
  76. e.printStackTrace();
  77. }
  78. return user;
  79. }
  80. /**
  81. * 解析GEO
  82. * @param jsonReader
  83. * @return
  84. */
  85. private ArrayList<Double> readGeo(JsonReader jsonReader) {
  86. ArrayList<Double> list = new ArrayList<>();
  87. try {
  88. jsonReader.beginArray();
  89. while (jsonReader.hasNext()){
  90. list.add(jsonReader.nextDouble());
  91. }
  92. jsonReader.endArray();
  93. } catch (IOException e) {
  94. e.printStackTrace();
  95. }
  96. return list;
  97. }
  98. }

  
  1. [
  2. {
  3. "id": 912345678901,
  4. "text": "How do I read a JSON stream in Java?",
  5. "geo": null,
  6. "user": {
  7. "name": "json_newb",
  8. "followers_count": 41
  9. }
  10. },
  11. {
  12. "id": 912345678902,
  13. "text": "@json_newb just use JsonReader!",
  14. "geo": [ 50.454722, - 104.606667],
  15. "user": {
  16. "name": "jesse",
  17. "followers_count": 2
  18. }
  19. }
  20. ]

  
  1. public class User {
  2. private String name;
  3. private int followers_count;
  4. public User() {
  5. }
  6. public User(String name, int followers_count) {
  7. this.name = name;
  8. this.followers_count = followers_count;
  9. }
  10. public String getName() {
  11. return name;
  12. }
  13. public void setName(String name) {
  14. this.name = name;
  15. }
  16. public int getFollowers_count() {
  17. return followers_count;
  18. }
  19. public void setFollowers_count(int followers_count) {
  20. this.followers_count = followers_count;
  21. }
  22. @Override
  23. public String toString() {
  24. return "User{" +
  25. "name='" + name + '\'' +
  26. ", followers_count=" + followers_count +
  27. '}';
  28. }
  29. }

三、 XMLJSON的比较:

从以下6点比较JSON与XML:
1、JSON和XML的数据可读性基本相同
2、JSON和XML同样拥有丰富的解析手段
3、JSON相对于XML来讲,数据的体积小
4、JSON与JavaScript的交互更加方便
5、JSON对数据的描述性比XML较差
6、JSON的速度要远远快于XML

适合的场景:
(1)数据传输:JSON要比XML更有优势
(2)存储数据:XML描述性更强
(3)XML通常用做配置文件(WEB课程中会有详细介绍)


转载:https://blog.csdn.net/qq_37857921/article/details/105928033
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场