`

JSON Lib, XML转JSON字符串不要namespace,以及处理特殊xml属性"type"

阅读更多
XMLSerializer xmlSerializer = new XMLSerializer();
JSON json = xmlSerializer.read(xml);
return json.toString(3);

 以上代码在xmll转成json字符串后,json字符串里会含有namespace属性,把下面的xml片断

<openremote xmlns="http://www.openremote.org" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:schemaLocation="http://www.openremote.org/panel.xsd">

 转为

{
"@xmlns": "http://www.openremote.org",
"@xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance",
"@xmlns:schemaLocation": "http://www.openremote.org/panel.xsd"
}

 但是这恰好是我不想要的属性。不用担心,只需给XMLSerializer加上设置属性skipNamespace为true即可,如下代码:

XMLSerializer xmlSerializer = new XMLSerializer();
xmlSerializer.setSkipNamespaces(true);
JSON json = xmlSerializer.read(xml);
return json.toString(3);

 好,这一点就告一段落.

 现在我又遇到了一个问题,那就是在xml里属性名为type的属性在转换后的json字符串中丢失了, 同样这一点也不用太担心,我看了一下XMLSerialzer的源码,发现XMLSerializer的构造器是这样写的:

public XMLSerializer() {
      setObjectName( "o" );
      setArrayName( "a" );
      setElementName( "e" );
      setTypeHintsEnabled( true );
      setTypeHintsCompatibility( true );
      setNamespaceLenient( false );
      setSkipNamespaces( false );
      setRemoveNamespacePrefixFromElements( false );
      setTrimSpaces( false );
      setExpandableProperties( EMPTY_ARRAY );
      setSkipNamespaces( false );
   }

 其中

setTypeHintsEnabled( true );
setTypeHintsCompatibility( true );

 就在搞鬼了, 因为在XMLSerialzer的

private JSON processObjectElement( Element element, String defaultType )

 方法中还有这么一段把xml转为json的代码,如下:

      // process attributes first
      int attrCount = element.getAttributeCount();
      for( int i = 0; i < attrCount; i++ ){
         Attribute attr = element.getAttribute( i );
         String attrname = attr.getQualifiedName();
         if( isTypeHintsEnabled()
               && (addJsonPrefix( "class" ).compareToIgnoreCase( attrname ) == 0 || addJsonPrefix(
                     "type" ).compareToIgnoreCase( attrname ) == 0) ){
            continue;
         }
         String attrvalue = attr.getValue();
         setOrAccumulate( jsonObject, "@" + removeNamespacePrefix( attrname ),
               trimSpaceFromValue( attrvalue ) );
      }

addJsonPrefix的代码片断为

   private String addJsonPrefix( String str ) {
      if( !isTypeHintsCompatibility() ){
         return JSON_PREFIX + str;
      }
      return str;
   }
 

现在,你应该很清楚的可以看到当在构造器中

setTypeHintsEnabled(true);
setTypeHintsCompatibility(true); 

 的时候

if( isTypeHintsEnabled()
               && (addJsonPrefix( "class" ).compareToIgnoreCase( attrname ) == 0 || addJsonPrefix(
                     "type" ).compareToIgnoreCase( attrname ) == 0) )

 也为true.

 这样的话,type这个属性就被pass掉了。

所以,为了让type这个比较特殊的属性能在转换后的json字答串中出现,你只需对XMLSerialzer的实例这样做:

setTypeHintsEnabled(false);

 或

setTypeHintsCompatibility(false);

 或

setTypeHintsEnabled(false);
setTypeHintsCompatibility(false);

 也就是说,反正让

if( isTypeHintsEnabled()
               && (addJsonPrefix( "class" ).compareToIgnoreCase( attrname ) == 0 || addJsonPrefix(
                     "type" ).compareToIgnoreCase( attrname ) == 0) )

 为false就行,这样在xml中有type这个属性的时候就会转换为 "@type":"xxxx"

OK, 我的问题也解决。希望可以给你带来帮助。

5
0
分享到:
评论
2 楼 hldfxh 2015-03-20  
 

解决了我的问题
1 楼 xiaobenbenxiong 2012-07-10  
多谢指导

相关推荐

    Struts2.1.6中关于JSON的配置和使用

    - 在回调函数中,首先使用`window.alert`显示返回的JSON字符串,然后通过`eval`函数将字符串转换为JavaScript对象,最后使用`$("#testjson").html(data)`将数据动态地填充到页面上指定的`&lt;div&gt;`元素中。 ### 总结 ...

    Struts2中使用JSON数据格式所需全部jar包

    它由键值对组成,数据以键(key):值(value)的形式存储,值可以是字符串、数字、布尔值、数组、对象或null。这种结构使得JSON易于阅读和编写,同时也方便了机器解析和生成。 在Struts2中使用JSON,需要引入以下...

    struts2使用json时要添加的jar包

    同时,Action类中的返回值应该是一个可以序列化为JSON的对象,或者是一个包含JSON数据的字符串。 在完成以上步骤后,Struts2框架就能够处理JSON请求和响应,使得你的应用能够更加灵活地进行前后端数据交互。记住,...

    Struts2返回JSON对象[参考].pdf

    - **实现Serializable接口**:为了使对象能够序列化为JSON字符串,实体类需要实现`Serializable`接口。 #### 四、Action类实现 1. **TestAction类**: ```java public class TestAction extends ActionSupport ...

    struts2.1.8.1+jquery1.4.2返回json数据.pdf

    这里定义了三个方法,分别用于返回字符串、对象以及对象列表。 ##### 3. 配置文件设置 在Struts2中,配置文件(通常是`struts.xml`)用于定义Action的映射和结果处理方式。为了支持JSON输出,我们需要进行以下配置...

    struts2和json交互汇编.pdf

    // 返回单个字符串消息 public String returnMsg() { this.message = "成功返回单个值"; return SUCCESS; } // 返回单个UserInfo对象 public String returnUser() { userInfo = new UserInfo(); userInfo....

    C++使用jsoncpp解析json的方法示例

    - **Json::FastWriter**:快速生成未格式化的JSON字符串,适合效率优先的情况。 - **Json::StyledWriter**:生成格式化的JSON字符串,易于人类阅读。 以下是一个简单的C++代码示例,演示如何使用jsoncpp解析JSON...

    struts学习笔记

    - **默认命名空间**:如果没有显式指定命名空间,则默认为空字符串,即所有的Action都属于同一个命名空间。 #### 四、其他知识点 **1. Action名称的搜索顺序**: - Struts2在解析请求时,会根据请求路径中的...

    Extjs中文教程

    - 通过`Ext.XTemplate.compile()`方法编译模板字符串,然后使用`apply`方法填充数据。 #### 六、格式化 - **用户需要优秀体验的内容** - 指的是在用户界面上呈现的数据应该易于阅读和理解。 - 例如日期、货币、...

Global site tag (gtag.js) - Google Analytics