Это потому, что он неправильно URL-кодированный . Эти скобки, двоеточия и запятые запрещены в URL. Я понимаю, что ваша строка JSON изначально выглядит так, верно?
var json = {
'title': '回复:foo',
'tag': '',
'content': 'TEST',
'Friedly': '',
'IsPrivate': '',
'Contact': '',
'base': 5197
};
(что на самом деле неверно JSON, эти одинарные кавычки должны были быть двойными)
Сначала вам нужно сериализовать JSON в строку. Строковое представление JavaScript должно выглядеть так:
var jsonString = '{"title":"回复:foo","tag":"","content":"TEST","Friedly":"","IsPrivate":"","Contact":"","base":5197}';
(ради полноты я исправил недействительные одинарные кавычки)
Как добраться до этого формата оставлено для вас в качестве упражнения. JSON-js
полезен в этом.
Затем вы должны были использовать JavaScript-функцию encodeURIComponent()
, чтобы URL-кодировать ее в правильный формат значения параметра HTTP-запроса:
var urlEncodedJsonString = encodeURIComponent(jsonString);
, что должно привести к этому значению
%7B%22title%22%3A%22%E5%9B%9E%E5%A4%8D%EF%BC%9Afoo%22%2C%22tag%22%3A%22%22%2C%22content%22%3A%22TEST%22%2C%22Friedly%22%3A%22%22%2C%22IsPrivate%22%3A%22%22%2C%22Contact%22%3A%22%22%2C%22base%22%3A5197%7D
Наконец, вы можете включить это значение в строку запроса вашего HTTP-запроса, и вы сможете использовать getParameter()
обычным способом (а затем передать его в какой-нибудь синтаксический анализатор JSON, например Gson, чтобы получить полноценный объект Java из него) , Обратите внимание, что вам не нужно вручную URL-декодировать его. Servlet API сделает это за вас, когда вы используете getParameter()
для получения отдельного параметра вместо того, чтобы вручную анализировать строку запроса из getQueryString()
. Этот вызов Map#containsKey()
также совершенно не нужен, просто получите параметр getParameter()
. Если это null
, то оно просто не было отправлено, иначе оно есть.