2013-03-10 3 views
4

Я использую IBM Worklight Studio и пытаюсь создать HTTP-адаптер, который извлекает объект JSON с внешнего HTTP-сервера.Ошибка HTTP-адаптера «Runtime: не удалось разобрать строку JSON»

Когда я только доступ к серверу HTTP цели с HTTP Получить доступ (с браузером, например), я знаю, что их ответ, как следующий стиль массива формат JSON:

[ 
    { "xxx":"aaa", "yyy":"bbb", ... }, 
    { "xxx":"ccc", "yyy":"ddd", ... }, 
    : 
    { "xxx":"eee", "yyy":"fff", ... } 
] 

И я создал HTTP адаптер, который будет получить информацию выше

var input = { 
    method : 'get', 
    returnedContentType : 'json', 
    path : path 
}; 

return WL.Server.invokeHttp(input); 

Теперь я попытался вызвать этот адаптер с "Run As -> Invoke Worklight Процедура", то я получил сообщение об ошибке:

{ 
    "errors": [ 
     "Runtime: Failed to parse JSON string\n\n[\n {\n 
    (raw JSON data) } ], 
    "info": [], 
    "isSuccessful": false, 
    "warnings": [] 
} 

И в моем журнале консоли, Worklight говорит следующее сообщение об ошибке:

FWLSE0101E: Caused by: java.io.IOException: Expecting '{' on line 2, column 2 instead, obtained token: 'Token: [' 

Из выше информации, кажется, что Worklight бы ожидать, что возвращаемый объект JSON нужно начать с «{», а не «[».

Действительно ли это мое предположение? Есть ли обходной путь для этого?

Спасибо за продвижение.

+0

Просто убедитесь, что ответ, исходящий с целевого сервера, начинается с '\ n'? –

+0

Да. Самая первая строка - это просто '\ n', а вторая строка начинается с" [". – user2133963

ответ

3

Вы можете изменить returnContentType на "plain", это заставит WL-сервер возвращать контент как большую строку, а не пытаться его проанализировать. Затем в вашем адаптере вы можете использовать var obj = JSON.parse (response.text)

+0

Спасибо Антон. Я изменил файл .js моего HTTP-адаптера, чтобы получить обычный текстовый формат, как вы предложили (returnContentType: 'plain'), что приводит к выполнению WL.Client.invokeProcedure succseeded. Я также изменил javascript функции JavaScript обратного вызова как «var objs = JSON.parse (result.invocationResult.text);». Я подтвердил это, как я ожидал. Большое спасибо!! – user2133963

4

Подсветка знает, как обращаться с объектами JSON, которые начинаются с [ (массивы JSON). В таком случае Worklight возвращает ответ, как:

{ "array" : [*the json array*]} 

Глядя на код адаптера HTTP, я вижу, что есть ошибка с разбора JSON массивы, которые не начинаются с [.

Я не вижу обходного пути для этой проблемы, кроме изменения ответа, полученного с http-сервера.

Я открыл внутреннюю ошибку об этом, спасибо, что помогли нам найти эту ошибку.

+0

Я ценю вашу поддержку. Я проверил еще раз, и кажется, что ответ от http-сервера начинается с '\ n', поэтому ваше предположение будет правильным. Но это неправильный формат? На самом деле этот http-сервер - это другой продукт IBM (Lotus Domino), и я не думаю, что этот формат можно будет настроить. – user2133963

+0

Конечно, я понимаю. Я ценю, что рассматриваю эту проблему. – user2133963

+1

Если вы являетесь клиентом IBM, вы можете открыть PMR об этой проблеме, там может быть найдено решение. – 2013-03-11 15:02:08