Groovy: преобразовать массив JSON в строку с URL-кодированием?

Я пишу приложение для SmartThings (www.smartthings.com) в их собственной среде IDE. У меня есть поле ввода, которое должно быть текстовым вводом. Прошу адрес отправления:

section("Departing From:"){
    input "departFrom", "text", title: "Address?"
}

при вводе значения Monterey, CA значение волшебным образом изменяется на массив JSON со значениями [Monterey, CA]

Я хочу передать это значение оператору httpGET, но сначала мне нужно URLencode, чтобы опустить пробелы и т. д. Я пробовал URLencoder безуспешно из-за массива JSON.

Я пробовал join(",") безуспешно, так как он добавляет двойные кавычки к значению.

Как я могу получить из этой переменной чистое закодированное значение URL-адреса Monterey%2C%20CA?

** имейте в виду, что кто-то может ввести любую комбинацию цифр, пробелов и запятых в этот ввод в качестве адреса. Mapquest API, которому я его отправляю, может обрабатывать все эти вещи, если они не имеют специальных символов, а пробелы закодированы в URL.


person Brian    schedule 16.07.2014    source источник
comment
Пробовали ли вы docs.oracle.com/javase/7/docs/api/java/net/   -  person tim_yates    schedule 17.07.2014
comment
да. он терпит неудачу, потому что это массив и ожидается строка   -  person Brian    schedule 17.07.2014


Ответы (2)


Возможно, попробуйте:

def l = ['Monterey', 'CA']
assert URLEncoder.encode(l.join(', ')).replaceAll('\\+','%20') == 'Monterey%2C%20CA'

Когда дело доходит до замены знака +, см. здесь

person Opal    schedule 17.07.2014

Существуют разные типы кодирования URL, но в данном случае их два: один преобразует пробелы в %20, а другой преобразует пробелы в +.

Во-первых, вы должны использовать UriUtils:

def yourEncodedString = UriUtils.encodeUri(yourString.toString(), "UTF-8")

Во-вторых, вы должны использовать UrlEncoder:

def yourEncodedString = URLEncoder.encode(yourString.toString(), "UTF-8")

В качестве альтернативы (я думаю) вы можете использовать URLEncoder с UTF-16, чтобы получить то, что вы хотите.

Я никогда не развлекался с UriUtils, поэтому, надеюсь, UrlEncoder вам подойдет.

person paranoid    schedule 16.07.2014
comment
как упоминалось в комментариях выше, URLencoder не работает, потому что ввод представляет собой массив, а не строку. tostring() не сделал ничего для улучшения. Результат %5B%22felton%22%2C%22+ca%22%5D. uriutils ошибка компилятора java.lang.NullPointerException: Cannot invoke method encodeUri() on null object - person Brian; 17.07.2014
comment
Во-первых, убедитесь, что ваши тесты написаны правильно: def town = "felton, ca" def encodedTown = URLEncoder.encode(town, "UTF-8") println encodedTown felton%2C+ca Вы должны убедиться, что понимаете, почему вам нужен %20 вместо +. Из javadocs: этот класс содержит статические методы для преобразования строки в формат MIME application/x-www-form-urlencoded. И из спецификации HTML: application/x-www-form-urlencoded Формы, отправленные с этим типом содержимого, должны быть закодированы следующим образом: Имена и значения элементов управления экранируются. Символы пробела заменены на «+» - person paranoid; 17.07.2014
comment
Если вы все еще уверены, что вам нужен %20, вы можете сделать это: println URLEncoder.encode("felton, ca", "UTF-8").replace("+", "%20") ` - person paranoid; 17.07.2014
comment
Возможно, я был неясен, но, как указано в моем OP и комментарии ниже, моя проблема связана с массивом, а не с тем, является ли его %20 или +. Я получаю %5B%22felton%22%2C%22+ca%22%5D, который кодирует скобки и кавычки. - person Brian; 18.07.2014