无法从VALUE_STRING中反序列化java.util.List的实例

时间:2015-03-23 13:06:18

标签: javascript php jquery json

我正在开发一个应用程序,我想将一些数据发送到服务器并获得响应。我应该使用的格式如下。

{
   "userName" :"testuser2@test.com",
   "targetUserName":"janagan.h@gmail.com",
   "admin":"false",
   "privilege": [{ "site":1, "privileges": ["LIVE_FEED","PLAYBACK"] } ] 
}

我应发送的数据由javascript填充并发送到PHP函数,我在其中使用curl将请求发送到服务器。以下是我用来发送请求的功能。

function baloba_update_user_priviledges(){
    if( isset($_SESSION['user']) && isset($_POST['username']) && isset($_POST['is_admin']) && isset($_POST['privArray']) ){


    $data = array('userName' => $_SESSION['user'], 'targetUserName' => $_POST['username'], 'privilege' => stripslashes($_POST['privArray']), 'admin' => $_POST['is_admin']);

    echo json_encode($data);


    $ch = 'https://54.169.242.241:8243/service_management_api/1.0/services/usermanage/assign_privilege';
    $responseData = baloba_api_requset($data ,$ch);
    extract($responseData);

    if($status == 'SUCCESS'){
        echo json_encode(array('status' => 'SUCCESS', 'message' => $message ),TRUE);
        die();
    }
}

}

我使用echo来查看正在设置$data数组的内容。以下是。

{"userName":"testuser2@test.com","targetUserName":"testuser1@test.com","privilege":"[{\"site\":\"a0626000000HnwdAAC\",\"privileges\":[\"LIVE_FEED\",\"PLAYBACK\"]}]","admin":"false"}

当我将此数组发送到服务器时,它会返回以下错误。

HTTP Status 400 - org.codehaus.jackson.map.JsonMappingException: Can not deserialize instance of java.util.List out of VALUE_STRING token
at [Source: org.apache.catalina.connector.CoyoteInputStream@5ba88001; line: 1, column: 71]

用于生成数据的javascript如下。

function saveUserPriviledges(username,privArray){
    return  $.ajax({
                type    : 'POST',
                url     : '/wordpress/wp-admin/admin-ajax.php',
                data    : { action: "baloba_update_user_priviledges", 'username' : username, 'is_admin' : false , 'privArray' : JSON.stringify(privArray) },
            });
}

function saveUserPriviledgeHandler(username,privArray){
    $.when(saveUserPriviledges(username,privArray)).then(function(response){
        console.log(JSON.parse(response));
    })
}

function priviledgeObjCreator(siteId,privArray){
    return { 'site':siteId , 'privileges':privArray }
}

$(document).on('click','.save-priv-changes',function(){
        var privObjArray = [];
        var priv = [];
        var user = $('#userPriv').data('priv-current-user')

        $('#userPriv .tab-pane').each(function(e,tab){
            $(tab).find('.cmn-toggle:checked').each(function(i,el){
                priv.push($(el).attr('id').replace('cmn-toggle-',''));
            })
            privObjArray.push(priviledgeObjCreator(tab.id.replace('user-priv-',''),priv));
        })

        saveUserPriviledges(user,privObjArray)

})

我在这里做错了什么。我在php中也使用了stripslashes函数。但我无法生成必要的请求字符串。我该如何以相同的格式提出请求。我理解当我发送正确的请求格式时它是成功的并且java代码中没有错误,因为错误是在java端。

1 个答案:

答案 0 :(得分:2)

首先应删除斜杠,然后使用html_entity_decode删除POST中的所有编码,然后将json字符串解码为原始数组。以下是一个例子。

json_decode(html_entity_decode(stripslashes($_POST['privArray'])))