【问题标题】:How to parse 'HttpServletRequest' with value of key value pair data如何使用键值对数据的值解析“HttpServletRequest”
【发布时间】:2015-01-26 11:28:03
【问题描述】:

我正在从我的客户端向我的服务器发送一个 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 发送。

【问题讨论】:

    标签: javascript ajax jakarta-ee servlets


    【解决方案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 使用 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;
        }
    

    【讨论】:

    • 试图将其用作 Map requestParams = request.getParameterMap();并在拥有正确密钥的同时对其进行转换,但它不能从字符串转换为映射'Ljava.lang.String;无法转换为 java.util.Map'
    • 由于某种原因,get 操作返回字符串对象 insted of Object
    • getParameterMap() 仅返回 Map。使用 json 或 jackson 库遍历字符串以获取其他值
    • Map requestParams = request.getParameterMap(); JSONObject jsonObj = (JSONObject)rquestParams.get("itemSpecifics");通过这样做,我得到了无法从 String [] 转换为 JSONObject 的编译错误,如上述建议..
    • 我更新了代码。请检查。还是您仍然面临问题?
    【解决方案2】:

    你可以试试这个。 sysout 打印 [Object,Object] 表示有两个字符串对象。

    有几种可能的方式来声明这样的字符串数组

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

        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 传递。

    【讨论】:

    • 这就是我得到的:无法从字符串转换为 JSONObject。有什么想法吗?
    • @USer22999299 我不认为你得到一个字符串,你得到一个对象数组,因为sysout 打印[object Object],它不打印字符串值。调用paramValues[i].toString() 会给相同的输出。你试过这种方法吗?
    • 在应用上面的代码时,我得到了无法从 String 转换为 JSONObject 的编译错误。 paramValues 是一个字符串[]
    • @USer22999299 我已经更新了我的答案,假设容器将如何解析这个字符串数据。
    猜你喜欢
    • 1970-01-01
    • 2017-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多