为什么都反对 XML 而支持使用 JSON?

161 2024-02-24 04:54

一、为什么都反对 XML 而支持使用 JSON?

很多程序员并没有亲自设计过XML格式的DSL语言,只是听业界的前辈讲过上古时代的XML是如何被后起之秀淘汰的传说,就由此形成了一种刻板印象,认为XML过于冗长,只能用于机器之间传递信息,并不适合于人机交互。但是,这是一种错误的偏见,源于XML原教旨主义对于XML错误的使用方式,以及一系列XML国际规范对错误使用方式的推波助澜。

很多人一想到用XML来表达逻辑,浮上心头的刻板印象可能是

<function>
   <name>myFunc</name>
   <args>
      <arg>
         <arg>
           <name>arg1</name>
           <value>3</value>
         </arg>
         <arg>
           <arg>
              <name>arg2</name>
              <value>aaa</value>
           </arg>
         </arg>
      </arg>
   </args>
</function>

但是实际上我们完全可以采用如下XML格式

<myFunc arg1="3" arg2="aa" />

如果要表达arg1的参数值类型是整数类型,而不是字符串类型,则可以对XML语法进行扩展,允许直接使用数字作为属性值。也可以类似Vue框架,通过补充特定的前缀信息来区别是否字符串,例如规定@:前缀表示后面的值满足JSON语法规范,可以按照JSON格式进行解析。

<myFunc arg1=3 arg2="aa" /> 或者
<myFunc arg1="@:3" arg2="aa" />

在Nop平台中,我们规定了JSON和XML之间的双向转换规则。例如对于如下AMIS页面描述:

{
  "type": "crud",
  "draggable": true,
  "bulkActions": [
    {
      "type": "button",
      "label": "批量删除",
      "actionType": "ajax",
      "api": "delete:/amis/api/mock2/sample/${ids|raw}",
      "confirmText": "确定要批量删除?"
    },
    {
      "type": "button",
      "label": "批量修改",
      "actionType": "dialog",
      "dialog": {
        "title": "批量编辑",
        "name": "sample-bulk-edit",
        "body": {
          "type": "form",
          "api": "/amis/api/mock2/sample/bulkUpdate2",
          "body": [
            {
              "type": "hidden",
              "name": "ids"
            },
            {
              "type": "input-text",
              "name": "engine",
              "label": "Engine"
            }
          ]
        }
      }
    }
  ]
}

对应的XML格式为

<crud draggable="@:true">
  <bulkActions j:list="true">
    <button label="批量删除" actionType="ajax" confirmText="确定要批量删除?">
      <api>delete:/amis/api/mock2/sample/${ids|raw}</api>
    </button>
    <button label="批量修改" actionType="dialog">
      <dialog title="批量编辑" name="sample-bulk-edit">
        <body>
           <form>
             <api>/amis/api/mock2/sample/bulkUpdate2</api>
             <body>
               <hidden name="ids" />
               <input-text name="engine" label="Engine" /> 
             </body>
           </form>
        </body>
      </dialog>
    </button>
  </bulkActions>
</crud>

实际上XML语法看起来要更加紧凑直观。

这里使用的是无元模型约束的JSON-XML转换,所以需要使用j:list来标记数组元素,并用@:前缀来表示非字符串值。如果XML文件具有XDef元模型定义,就不需要这些额外的标注信息了。

使用XML相对于JSON格式的另外一个好处是它可以很容易的引入XML扩展标签来用于代码生成,代码的表示形式和代码生成的结果形式都是XML格式,这在Lisp语言中被称作是同像性目前JSON格式缺乏一种同像的代码生成方式

<columns>
  <c:forEach var="col" items="${entityModel.columns}">
    <column name="${col.name}" sqlType="${col.sqlType}" />
  </c:forEach>  
</columns>

关于XML和JSON的等价性,进一步的讨论可以参见

canonical:XML、JSON和函数AST的等价性

二、XML与JSON有什么不同?

1)XML 和JSON是两种完全不同的数据表达方式。他们分别采用完全不同格式将原始数据转换成XML或者JOSN格式数据;然后再将XML或JOAN格式的数据还原为原始数据2)Socket是用来编写TCP/IP或UDP/IP通信程序的;HTTP是使用TCP/IP的“应用层协议”,HTTP协议利用(借助于) TCP/IP 实现传输。

3)XML和JSON都可以借助HTTP进行传输===一个形象的比喻:TCP/IP是由SOCKET修建公路,HTTP是公路上跑的车,XML或JSON是车装载的货物。

三、xml和json的区别,优缺点?

XML(可扩展标记语言)和JSON(JavaScript对象表示法)是两种常用的数据交换格式,它们在以下几个方面存在区别:

1. 语法和结构:XML使用标签来定义数据的结构和元素,具有更严格的语法规范。而JSON使用键值对的方式来表示数据,结构更简洁、灵活。

2. 可读性:相对而言,XML更容易阅读和理解,因为它使用明确的标签和属性来定义数据。JSON则更加紧凑,适合机器处理。

3. 数据体积:JSON通常比XML更短小,因为它使用较少的字符来描述数据结构,从而减小了数据传输和存储的体积。

4. 数据类型支持:JSON天然支持常见的数据类型,如字符串、数字、布尔值、数组和对象。对于XML,需要通过特定的规范(如XML Schema)来定义和验证数据类型。

5. 扩展性:XML具有较强的扩展性,可以通过定义新的标签和命名空间来适应不同的需求。JSON相对来说扩展性较弱,需要在设计时考虑到所有数据字段。

优点和缺点:

XML的优点:

- 数据描述能力强,易于理解和验证。

- 支持自定义标签和命名空间,具有较强的扩展性。

- 广泛应用于许多行业和应用领域。

XML的缺点:

- 数据冗余较高,体积较大,传输效率相对较低。

- 解析和处理XML的复杂性较高,占用更多的计算资源。

JSON的优点:

- 数据体积小,传输效率高。

- 解析和处理JSON相对简单,速度较快。

- 与JavaScript密切结合,适用于Web应用和前后端数据交互。

JSON的缺点:

- 不支持注释和CDATA等特定的功能。

- 对复杂的数据结构(如嵌套多层的数据)可能不够直观和易读。

- 无法描述数据类型的具体规范。

综上所述,选择XML还是JSON取决于具体的需求和应用场景。XML适用于复杂的数据结构和较强的数据验证要求,而JSON适用于简单、紧凑且高效的数据交换。

四、如何使用jackson美化输出json/xml?

1.美化POJO序列化xml 下面将POJO列化为xml并打印。 Person person = new Person(); //设置person属性 ObjectMapper mapper = new XmlMapper(); System.out.println(mapper.writeValueAsString(person)); 但是输出为紧凑模式: 2.目的:美化过的输出 有时希望能够美化输出,更方便阅读和理解,如: 方式1.使用:writerWithDefaultPrettyPrinter ObjectMapper mapper = new XmlMapper(); System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(person)); mapper.enable(SerializationFeature.INDENT_OUTPUT); 方式2.使用:SerializationFeature.INDENT_OUTPUT ObjectMapper mapper = new XmlMapper(); mapper.enable(SerializationFeature.INDENT_OUTPUT); mapper.writeValueAsString(person); 3.序列化为json 序列化为json时,操作基本一致,只需要使用ObjectMapper替代XmlMapper。如: Person person = new Person(); //设置person属性 ObjectMapper mapper = new ObjectMapper(); System.out.println(mapper.writeValueAsString(person)); 激活美化的方式,同样可以是2.1和2.2介绍的方式。 4.包依赖 序列化为xml依赖: jackson-databind jackson-core jackson-dataformat-xml 序列化为json依赖: jackson-databind jackson-core

五、json转list?

android中json转换成List<Map>Java代码packagecn.anycall;importjava.util.ArrayList;importjava.util.HashMap;importjava.util.Iterator;importjava.util.List;importjava.util.Map;importorg.json.JSONArray;importorg.json.JSONException;importorg.json.JSONObject;publicclassTest{/***将json数组转换为Map对象*@paramjsonString*@return*/publicstaticMap<String,Object>getMap(StringjsonString){JSONObjectjsonObject;try{jsonObject=newJSONObject(jsonString);@SuppressWarnings("unchecked")Iterator<String>keyIter=jsonObject.keys();Stringkey;Objectvalue;Map<String,Object>valueMap=newHashMap<String,Object>();while(keyIter.hasNext()){key=(String)keyIter.next();value=jsonObject.get(key);valueMap.put(key,value);}returnvalueMap;}catch(JSONExceptione){e.printStackTrace();}returnnull;}/***把json转换为ArrayList形式*@return*/publicstaticList<Map<String,Object>>getList(StringjsonString){List<Map<String,Object>>list=null;try{JSONArrayjsonArray=newJSONArray(jsonString);JSONObjectjsonObject;list=newArrayList<Map<String,Object>>();for(inti=0;i<jsonArray.length();i++){jsonObject=jsonArray.getJSONObject(i);list.add(getMap(jsonObject.toString()));}}catch(Exceptione){e.printStackTrace();}returnlist;}/***@paramargs*/publicstaticvoidmain(String[]args){//TODOAuto-generatedmethodstubStringtemp="[{\"aa\":\"1\",\"bb\":\"2\"},{\"aa\":\"3\",\"bb\":\"4\"},{\"aa\":\"5\",\"bb\":\"6\"}]";List<Map<String,Object>>lm=Test.getList(temp);for(inti=0;i<lm.size();i++){System.out.println(lm.get(i).get("aa"));System.out.println(lm.get(i).get("bb"));}}}

六、ajax json xml javascript的区别和联系?

[ XML ]

使用XML作为传输格式的优势:

1. 格式统一, 符合标准

2. 容易与其他系统进行远程交互, 数据共享比较方便

缺点:

1. XML文件格式文件庞大, 格式复杂, 传输占用带宽

2. 服务器端和客户端都需要花费大量代码来解析XML, 不论服务器端和客户端代码变的异常复杂和不容易维护

3. 客户端不同浏览器之间解析XML的方式不一致, 需要重复编写很多代码

4. 服务器端和客户端解析XML花费资源和时间

[ JSON ]

那么除了XML格式, 还有没有其他格式, 有一种叫做JSON (JavaScript Object Notation) 的轻量级数据交换格式能够替代XML的工作.

优点:

1. 数据格式比较简单, 易于读写, 格式都是压缩的, 占用带宽小

2. 易于解析这种语言, 客户端JavaScript可以简单的通过eval()进行JSON数据的读取

3. 支持多种语言, 包括ActionScript, C, C#, ColdFusion, Java, JavaScript, Perl, PHP, Python, Ruby等语言服务器端语言, 便于服务器端的解析

4. 在PHP世界, 已经有PHP-JSON和JSON-PHP出现了, 便于PHP序列化后的程序直接调用. PHP服务器端的对象、数组等能够直接生JSON格式, 便于客户端的访问提取.

另外PHP的PEAR类已经提出了支持 (http://pear.php.net/pepr/pepr-proposal-show.php?id=198)

5. 因为JSON格式能够直接为服务器端代码使用, 大大简化了服务器端和客户端的代码开发量, 但是完成的任务不变, 且易于维护

缺点:

1. 没有XML格式这么推广的深入人心和使用广泛, 没有XML那么通用性

2. JSON格式目前在Web Service中推广还属于初级阶段

七、xml 和json互转会有问题吗?

没有问题。两种格式相互兼容,可以互转,而且不存在乱码问题,相对而言xml格式应用更广,通用性更好。都是数据库系统文件。

八、java实现复杂的xml转化为JSON?

提供一种方案:xml通过jaxb转换成java对象,然后java对象再转换为json,都有现成的框架。

九、stl怎么转xml?

打开转换工具,选择stl转换成xml即可

十、osgb怎么转xml?

在WPS软件中打开word文档,然后另存为XML文件即可。具体操作请参照以下步骤。

1、在电脑上用wps软件打开目标word文件,进入主编辑界面。

2、然后点击软件左上角的WPS文字字样,会弹出一个下拉菜单。

3、接着在下拉菜单中依次点击选项“文件/另存为”。

4、然后会进入到保存的对话框中,在文件类型选项栏中选择“WordXML”的格式。

5、最后点击保存即可。完成以上设置后,即可将word文档转化为XML格式的文件。

顶一下
(0)
0%
踩一下
(0)
0%
相关评论
我要评论
点击我更换图片