http://blog.csdn.net/doubeizhucele/article/details/42263887

fintesse会把!{}标记的变量视为HashTable对象,展现到页面上的将是table格式(userguide中提到可以改变hashtable的css样式)

======   Java 代码   =========

public Map getMap(Map map) {
        Set set =map.keySet();
        for(Object key:set){
            System.out.println(key+":"+map.get(key));
        }
        return map;
    }

====== fitnesse脚本  ============

!define teacher [!{name:laozhang,tech:Math}]
!define xiaoming [!{name:tom,age:18,teacher:${teacher}}]

|script|!-Test-!                 |
|$a=   |getMap;      |${xiaoming}|

==== 执行结果  =======

======  分析原因  =================

1. 修改代码

public Map getMap(Map map) {
        Set set =map.keySet();
        for(Object key:set){
            System.out.println(key+":"+map.get(key).getClass().getName());
        }
        return map;
    }

2.  执行fitnesse脚本后,查看日志,发现teacher的value是String型,而不是hashtable对象

age:java.lang.String
name:java.lang.String
teacher:java.lang.String

3. 再次修改代码

public Map getMap(Map map) {
        Map output = new HashMap();
        Set set = map.keySet();
        for (Object key : set) {
            System.out.println(key+":"+hashtableString2Map((String) map.get(key)));
            output.put(key, hashtableString2Map((String) map.get(key)));
        }
        return output;
    }

4. 执行fitnesse脚本后,查看输出结果和日志

age:18
name:tom
teacher:{name=laozhang, tech=Math}

5. 再次分析原因,发现fitnesse会把map接口对象自动视为hashtable(应该是为了fitnesse展现出较好的样式,但是如果把结果对象作为参数传入到其他方法内,可能会造成不可预期的错误,比如JSONObject的fromObject方法),为了避免可能的错误,需要把输出类型强制转换为HashMap,代码如下

public HashMap getMap(Map map) {
        Map output = new HashMap();
        Set set = map.keySet();
        for (Object key : set) {
            System.out.println(key+":"+hashtableString2Map((String) map.get(key)));
            output.put(key, hashtableString2Map((String) map.get(key)));
        }
        return (HashMap) output;
    }

==== 新增方法hashtableString2Map ============

public static Object hashtableString2Map(String hashtableString) {
        if (hashtableString.startsWith("<table class=\"hash_table\">")
                && hashtableString.endsWith("</table>")) {
            Map map = new HashMap();
            Document document = XMLParser
                    .getDocumentFromString(hashtableString);
            Element parent = XMLParser.getRootNode(document);
            List hash_rows = parent.elements();
            String key = "";
            String value = "";
            for (int i = 0; i < hash_rows.size(); i++) {
                Element hash_row = (Element) hash_rows.get(i);
                List hashtableList = hash_row.elements();
                for (int j = 0; j < hashtableList.size(); j++) {
                    Element ele = (Element) hashtableList.get(j);
                    String attrValue = ele.attributeValue("class");
                    if ("hash_key".equals(attrValue)) {
                        key = ele.getText();
                    } else if ("hash_value".equals(attrValue)) {
                        value = ele.getText();
                    }
                    map.put(key, value);
                }
            }
            return map;
        }
        return hashtableString;
    }

再次执行fitnesse脚本,得到结果

[转] fitnesse中的Map处理的更多相关文章

  1. 【转】hive优化之--控制hive任务中的map数和reduce数

    一.    控制hive任务中的map数:  1.    通常情况下,作业会通过input的目录产生一个或者多个map任务. 主要的决定因素有: input的文件总个数,input的文件大小,集群设置 ...

  2. Map java中的map 如何修改Map中的对应元素

    Map java中的map 如何修改Map中的对应元素 Map以按键/数值对的形式存储数据,和数组非常相似,在数组中存在的索引,它们本身也是对象.         Map的接口         Map ...

  3. Java中Set Map List 的区别

    java中set map list的区别: 都是集合接口 简要说明 set --其中的值不允许重复,无序的数据结构 list   --其中的值允许重复,因为其为有序的数据结构 map--成对的数据结构 ...

  4. Java中遍历Map集合的四种方法

    在Java中如何遍历Map对象 How to Iterate Over a Map in Java 在java中遍历Map有不少的方法.我们看一下最常用的方法及其优缺点. 既然java中的所有map都 ...

  5. java8中的map和reduce

    java8中的map和reduce 标签: java8函数式mapreduce 2014-06-19 19:14 10330人阅读 评论(4) 收藏 举报  分类: java(47)  FP(2)  ...

  6. zk框架中利用map类型传值来创建window,并且传值

    @Command @NotifyChange("accList") public void clear(@BindingParam("id") String a ...

  7. python 中的map 详解

    python中的map函数应用于每一个可迭代的项,返回的是一个结果list.如果有其他的可迭代参数传进来,map函数则会把每一个参数都以相应的处理函数进行迭代处理.map()函数接收两个参数,一个是函 ...

  8. 由实现JavaScript中的Map想到的

    项目中要用到JavaScript中的Map数据类型,它不像JDK那样有自带的,怎么办?搜了找到一个不错的(http://darkmasky.iteye.com/blog/454749).用这个可以满足 ...

  9. perl编程中的map函数示例

    转自:http://www.jbxue.com/article/14854.html 发布:脚本学堂/Perl  编辑:JB01   2013-12-20 10:20:01  [大 中 小] 本文介绍 ...

随机推荐

  1. iOS微信支付demo运行报错解决如下

    要接入微信支付的小伙伴,首先要下载一份官方demo(APP微信支付官方Demo下载),然后打开工程,准备大干一场. 1.编译报错 编译的时候居然直接报错了(orz) 错误提示: APP微信支付官方De ...

  2. 微服务之springCloud-docker-feign配置(五)

    简介 上一节我们讨论了怎么用feign声明式调用cloud的生产者,这节我们讨论一下feign配置,通过编写配置类,我们可以自定义feign的日志级别,日志扫描目录,可以通过feign调用服务在eur ...

  3. 老项目Xcode5.1编译器错误

    老项目编译器错误html, body {overflow-x: initial !important;}html { font-size: 14px; } body { margin: 0px; pa ...

  4. c#获取网页代码、数据、资源

    //WebClient取网页源码 private string GetHtmlSource(string Url) { try { System.Net.WebClient wc = new Syst ...

  5. 【C】——信号量 互斥锁 条件变量的区别

    信号量用在多线程多任务同步的,一个线程完成了某一个动作就通过信号量告诉别的线程,别的线程再进行某些动作(大家都在semtake的时候,就阻塞在哪里).而互斥锁是用在多线程多任务互斥的,一个线程占用了某 ...

  6. Map与实体之间转换

    package com.thunisoft.maybee.engine.utils; import java.lang.reflect.Field; import java.lang.reflect. ...

  7. 微信小程序——计算2点之间的距离

    关于计算2点之间的距离都依赖了腾讯地图,所以请先在腾讯地图官网申请key.具体流程看下图: 下面具体讲计算2点之间距离的方法. 方法一: 1.通过 wx.getLocation(Object obje ...

  8. svn出现skips remain conficted,不能更新代码问题

    出现: skips remain conficted One or more files are in a conflicted state 然后commit的时候出现,很多都已经deleted,但是 ...

  9. HBase高性能复杂条件查询引擎

    转自:http://blog.csdn.net/bluishglc/article/details/31799255 mark 写在前面 本文2014年7月份发表于InfoQ,HBase的PMC成员T ...

  10. OSPF的特征、术语、包类型、邻居关系的建立、RID的选择、DR和BDR的选举、度量值的计算、默认路由、验证

    链路状态路由协议OSPF的特征.术语.包类型.邻居关系的建立.RID的选择.DR和BDR的选举.度量值的计算.默认路由.验证等. 文章目录 [*1*].链路状态路由协议概述 工作过程 优缺点 [*2* ...