如何用键值对数据的值解析'HttpServletRequest'

时间:2014-11-27 19:51:52

标签: javascript ajax java-ee servlets

我正从客户端向我的服务器发送ajax请求。

这是我传递的数据结构:

data = {"key1" : "value1" , "key2" : {"subkey1": "subvalue1" ,"subkey2" : "subvalue2"}};

在服务器端我正在执行以下操作:

   private Map<String, Object> parseItemData(HttpServletRequest request) {

    Enumeration<String> parameterNames = request.getParameterNames();

    while (parameterNames.hasMoreElements()) {

        String paramName = parameterNames.nextElement();

        String[] paramValues = request.getParameterValues(paramName);

        if(paramName.equals("itemSpecifics"))
        {
            System.out.println(paramName);

            for (int i =0 ; i<paramValues.length; i++)
            {
                System.out.println(paramName +": "+paramValues[i] );
            }
        }
    }
    return item;
}

这是我得到的输出:

itemSpecifics: [object Object]

有什么办法吗?


解决方案:

如果是嵌套键值对,我必须手动使用JSON.stringify()作为嵌套键值,以便将其作为JSON发送。

2 个答案:

答案 0 :(得分:1)

你可以试试这个。由于sysout打印[Object,Object],这意味着有两个String对象。

声明像这样声明字符串数组的可能方法

String[] keyValPair = new String[]{"\"key1\" : \"value1\"","key2:{}"} 这只是一个猜测容器如何解析这个类似Json的数据。可以将它转换为两个不同的String对象,将其作为String Array。

    String[] paramValues = request.getParameterValues(paramName);

    if(paramName.equals("itemSpecifics"))
    {
     System.out.println(paramName);

     String[] paramArr = (String[]) paramValues[0];
     String firstKeyVal = paramArr [0];//Contains "key1" : "value1" as String
     String secondKeyVal = paramArr [1];//Contains "key2" : {"subkey1": "subvalue1" ,"subkey2" : "subvalue2"} as String

     String value1= firstKeyVal.split(":")[1];
     String[] subValues = secondKeyVal.substring(secondKeyVal.indexOf("{")+1,secondKeyVal.indexOf("}")).split(",");
    String subVal1 = subValues[0].split(":")[1];
    String subVal2 = subValues[1].split(":")[1];

     System.out.println(paramName+" value1"+value1+" subVal1 "+subVal1+" subVal2 "+subVal2);

     }

最好的方法是将所有参数作为JSON传递。

答案 1 :(得分:1)

这可能会对你有帮助。

使用getParameterMap()方法获取所有键值对。

Map<String, String[]> requestParams = request.getParameterMap();

获取JSONObject的代码:

JSONObject jsonObject=null;
        Map<String,String> out = new HashMap<String, String>();
        Map<String,String[]> map = request.getParameterMap();

        for (Map.Entry<String,String[]> mapEntry : map.entrySet()) {

          String value[] = mapEntry.getValue();
          Object object = value.length == 1 ? value[0] : value;
          try {
              jsonObject = new JSONObject((String)object);
              parse(jsonObject,out);

        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        }
        response.getWriter().print(out);

解析json use parse函数:我已经从How can I iterate JSONObject to get individual items

获得了帮助
public static Map<String,String> parse(JSONObject json , Map<String,String> out) throws JSONException{
        Iterator<String> keys = json.keys();
        while(keys.hasNext()){
            String key = keys.next();
            String val = null;
            try{
                 JSONObject value = json.getJSONObject(key);
                 parse(value,out);
            }catch(Exception e){
                val = json.getString(key);
            }

            if(val != null){
                out.put(key,val);
            }
        }
        return out;
    }