Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Caché Новый топик    Ответить
 Parsing JSONs  [new]
Nadirbek Nurlybekov
Member

Откуда:
Сообщений: 5
Здравствуйте, коллеги! Есть проблема с парсингом json-ов, сгенерированых с помощью метода %ToJSON() системного класса %ZEN.proxyObject. После того, как клиент получил данные, выводится ошибка

"Error: JSON.parse: bad escaped character at line 5 column 19 of the JSON data".
Код метода на клиенте:
$http.get("/rest/json/persons").then(function(response) {
  $scope.persons 
response.data; }); 
Генерация json-ов на сервере:
  set status $$$OK
  try
  
{
    
set persons ##class(User.Person).GetPersons()
    
set proxy ##class(%ZEN.proxyObject).%New()
    
set proxy.data persons
    
do proxy.%ToJSON()
  
catch exception {
    
set status exception.AsStatus()
  
}
  
quit status
31 окт 16, 13:30    [19841575]     Ответить | Цитировать Сообщить модератору
 Re: Parsing JSONs  [new]
krvsa
Member

Откуда: г Волжский
Сообщений: 12635
Nadirbek Nurlybekov, так ты вызови ту страничку прямо в браузере и посмотри чего там тебе нагененрили... ;)
31 окт 16, 14:07    [19841852]     Ответить | Цитировать Сообщить модератору
 Re: Parsing JSONs  [new]
servit
Member

Откуда: г. Кишинёв, Республика Молдова
Сообщений: 3041
Блог
Nadirbek Nurlybekov,

По умолчанию %ToJSON() использует формат "aelotw". Попробуйте "aelotwu".
u - output pre-converted to UTF-8 instead of in native internal format
31 окт 16, 14:12    [19841888]     Ответить | Цитировать Сообщить модератору
 Re: Parsing JSONs  [new]
Nadirbek Nurlybekov
Member

Откуда:
Сообщений: 5
krvsa,

В браузере ничего не выводится. В консоли браузера выводится та ошибка.
31 окт 16, 14:15    [19841912]     Ответить | Цитировать Сообщить модератору
 Re: Parsing JSONs  [new]
servit
Member

Откуда: г. Кишинёв, Республика Молдова
Сообщений: 3041
Блог
Nadirbek Nurlybekov
krvsa,

В браузере ничего не выводится. В консоли браузера выводится та ошибка.
Для тестирования браузер необязателен: 17321595
Смотрите что формируется на сервере прямо на сервере.
31 окт 16, 14:29    [19842026]     Ответить | Цитировать Сообщить модератору
 Re: Parsing JSONs  [new]
Nadirbek Nurlybekov
Member

Откуда:
Сообщений: 5
servit,

Сгенерацией json-ов нет проблем. Именно с парсинг не работает на клиенте. Вот что мне выдал сервер:
{
"data":[ {
"Name":"Black,Susan G.",
"Login":"black",
"Password":"vØ\x02$aÉ¥ÕOùû¤F",
"PathPhoto":"J2668"
}, {
"Name":"Klausner,Charlotte U.",
"Login":"klausner",
"Password":"vØ\x02$aÉ¥ÕOùû¤F",
"PathPhoto":"G1880"
}, {
"Name":"Johnson,Frances Z.",
"Login":"johnson",
"Password":"vØ\x02$aÉ¥ÕOùû¤F",
"PathPhoto":"J1233"
}, {
"Name":"Alibaba",
"Login":"Alibaba",
"Password":"Alibaba",
"PathPhoto":""
}, {
"Name":"Nadirbek",
"Login":"Nadirbek",
"Password":"Nadirbek",
"PathPhoto":""
}, {
"Name":"Nadirbek",
"Login":"Nadirbek",
"Password":"Nadirbek",
"PathPhoto":""
}, {
"Name":"Alibaba",
"Login":"Alibaba",
"Password":"Alibaba",
"PathPhoto":""
}, {
"Name":"Alibaba",
"Login":"789789",
"Password":"798798",
"PathPhoto":""
}
]
}
31 окт 16, 15:23    [19842384]     Ответить | Цитировать Сообщить модератору
 Re: Parsing JSONs  [new]
krvsa
Member

Откуда: г Волжский
Сообщений: 12635
Nadirbek Nurlybekov
В браузере ничего не выводится.

Так ты не тот адрес поди смотришь... Ты указывай адрес своего запроса.
31 окт 16, 15:34    [19842452]     Ответить | Цитировать Сообщить модератору
 Re: Parsing JSONs  [new]
krvsa
Member

Откуда: г Волжский
Сообщений: 12635
Nadirbek Nurlybekov
servit,
Вот что мне выдал сервер:
{
        "data":[ {
                        "Name":"Black,Susan G.",
                        "Login":"black",
                        "Password":"vØ\x02$aÉ¥ÕOùû¤F",
                        "PathPhoto":"J2668"
                }, {
                        "Name":"Klausner,Charlotte U.",
                        "Login":"klausner",
                        "Password":"vØ\x02$aÉ¥ÕOùû¤F",
                        "PathPhoto":"G1880"
                }, {
                        "Name":"Johnson,Frances Z.",
                        "Login":"johnson",
                        "Password":"vØ\x02$aÉ¥ÕOùû¤F",
                        "PathPhoto":"J1233"
                }, {
                        "Name":"Alibaba",
                        "Login":"Alibaba",
                        "Password":"Alibaba",
                        "PathPhoto":""
                }, {
                        "Name":"Nadirbek",
                        "Login":"Nadirbek",
                        "Password":"Nadirbek",
                        "PathPhoto":""
                }, {
                        "Name":"Nadirbek",
                        "Login":"Nadirbek",
                        "Password":"Nadirbek",
                        "PathPhoto":""
                }, {
                        "Name":"Alibaba",
                        "Login":"Alibaba",
                        "Password":"Alibaba",
                        "PathPhoto":""
                }, {
                        "Name":"Alibaba",
                        "Login":"789789",
                        "Password":"798798",
                        "PathPhoto":""
                }
        ]
}

Вполне вменяемый вариант... Все работает нормально

var obj={
	"data":[ 
		{
			"Name":"Black,Susan G.",
			"Login":"black",
			"Password":"vØ\x02$aÉ¥ÕOùû¤F",
			"PathPhoto":"J2668"
		}, {
			"Name":"Klausner,Charlotte U.",
			"Login":"klausner",
			"Password":"vØ\x02$aÉ¥ÕOùû¤F",
			"PathPhoto":"G1880"
		}, {
			"Name":"Johnson,Frances Z.",
			"Login":"johnson",
			"Password":"vØ\x02$aÉ¥ÕOùû¤F",
			"PathPhoto":"J1233"
		}, {
			"Name":"Alibaba",
			"Login":"Alibaba",
			"Password":"Alibaba",
			"PathPhoto":""
		}, {
			"Name":"Nadirbek",
			"Login":"Nadirbek",
			"Password":"Nadirbek",
			"PathPhoto":""
		}, {
			"Name":"Nadirbek",
			"Login":"Nadirbek",
			"Password":"Nadirbek",
			"PathPhoto":""
		}, {
			"Name":"Alibaba",
			"Login":"Alibaba",
			"Password":"Alibaba",
			"PathPhoto":""
		}, {
			"Name":"Alibaba",
			"Login":"789789",
			"Password":"798798",
			"PathPhoto":""
		}
	]
};
console.log(obj);
31 окт 16, 15:40    [19842486]     Ответить | Цитировать Сообщить модератору
 Re: Parsing JSONs  [new]
servit
Member

Откуда: г. Кишинёв, Республика Молдова
Сообщений: 3041
Блог
Nadirbek Nurlybekov
Сгенерацией json-ов нет проблем. Именно с парсинг не работает на клиенте. Вот что мне выдал сервер:
И как видим сервер сгенерировал поле Password с кракозябрами. Подозреваю, что это бинарные данные.
Это при каком формате %ToJSON()? Приведите пример json с "u" и без.
31 окт 16, 15:40    [19842488]     Ответить | Цитировать Сообщить модератору
 Re: Parsing JSONs  [new]
servit
Member

Откуда: г. Кишинёв, Республика Молдова
Сообщений: 3041
Блог
krvsa
Вполне вменяемый вариант... Все работает нормально
Вменяемый для кого: клиента или сервера?
Вряд ли javascript понимает встроенный внутренний формат Caché (native internal format), используемый по умолчанию.
31 окт 16, 15:48    [19842540]     Ответить | Цитировать Сообщить модератору
 Re: Parsing JSONs  [new]
krvsa
Member

Откуда: г Волжский
Сообщений: 12635
servit
Вменяемый для кого: клиента или сервера?

Я привел пример JS-программы...
Все выводится в консоль браузера без проблем.
31 окт 16, 15:55    [19842593]     Ответить | Цитировать Сообщить модератору
 Re: Parsing JSONs  [new]
servit
Member

Откуда: г. Кишинёв, Республика Молдова
Сообщений: 3041
Блог
krvsa
Я привел пример JS-программы...
Все выводится в консоль браузера без проблем.
Вы привели некорректный пример.
Данные Вы передаёте с клиента на клиент, а надо с сервера на клиент. Кроме того у Вас пароли уже экранированы, тогда как у ТС - нет.
Википедия
Строка — это упорядоченное множество из нуля или более символов юникода, заключенное в двойные кавычки. Символы могут быть указаны с использованием escape-последовательностей, начинающихся с обратной косой черты «\» (поддерживаются варианты \", \\, \/, \t, \n, \r, \f и \b), или записаны шестнадцатеричным кодом в кодировке UTF-8 в виде \uFFFF proof.
31 окт 16, 16:07    [19842667]     Ответить | Цитировать Сообщить модератору
 Re: Parsing JSONs  [new]
krvsa
Member

Откуда: г Волжский
Сообщений: 12635
servit
Вы привели некорректный пример.

Какой автор тут предоставил - такой я и дал.
Другого у меня нет.
31 окт 16, 16:27    [19842813]     Ответить | Цитировать Сообщить модератору
 Re: Parsing JSONs  [new]
servit
Member

Откуда: г. Кишинёв, Республика Молдова
Сообщений: 3041
Блог
krvsa
servit
Вы привели некорректный пример.

Какой автор тут предоставил - такой я и дал.
Другого у меня нет.
Автор предоставил JSON, который:
  • он формирует на сервере
  • JSON без экранирования и в этом как раз и заключается проблема автора
  • этот JSON клиент не понимает, потому что он неэкранирован

Вы взяли предоставленный JSON и:
  • формируете его на клиенте
  • JSON Ваш внезапно уже экранирован
  • клиент его внезапно понимает.

Только Caché в Вашем примере никак не задействован.
31 окт 16, 16:46    [19842974]     Ответить | Цитировать Сообщить модератору
 Re: Parsing JSONs  [new]
servit
Member

Откуда: г. Кишинёв, Республика Молдова
Сообщений: 3041
Блог
Nadirbek Nurlybekov,

Если Вы используете try/catch и внутри вызываете метод, возвращающий %Status, а не исключение, то ошибка не перехватится.
Class tmp.test Abstract ]
{

ClassMethod MyError() As %Status InternalPrivate ]
{
  
q $$$ERROR($$$NotImplemented)
}

ClassMethod Test(As %Boolean = {$$$YES})
{
  
;d ##class(tmp.test).Test()
  
  
#dim ex As %Exception.AbstractException
  
try{
    
if {
      
tSC=..MyError()
    
else {
      
$$$ThrowOnError(..MyError())
    
}
  }
catch(ex{
    
ex.DisplayString(),!
  
}
}
}


------------------------------------

USER>##class(tmp.test).Test()

USER>##class(tmp.test).Test(0)
ОШИБКА #5003: Не реализовано
1 ноя 16, 09:37    [19844551]     Ответить | Цитировать Сообщить модератору
 Re: Parsing JSONs  [new]
Nadirbek Nurlybekov
Member

Откуда:
Сообщений: 5
servit
Приведите пример json с "u" и без.
А как это делать? Код %ToJSON() посмотрел. В его аргументах стоит вот что:

Method %ToJSON(pLevel As %Integer 0pFormat As %String "aelotw"As %Status Internal 

, то есть "aelotw". А "u" здесь не предусмотрено.
И try/catch я убрал. В терминале протестировал, но все выполнилось без ошибок. Проблема не в try/catch.

krvsa,

Password у меня крякозябрики, потому что это хэш-значения.

Как мне перевести объекты в json-ы, понимающий javascript?
1 ноя 16, 11:59    [19845350]     Ответить | Цитировать Сообщить модератору
 Re: Parsing JSONs  [new]
servit
Member

Откуда: г. Кишинёв, Республика Молдова
Сообщений: 3041
Блог
Nadirbek Nurlybekov
А как это делать?
А "u" здесь не предусмотрено.
По умолчанию если не передавать параметры, используются соответственно 0 и "aelotw", но можно их задать с другими значениями (см. 17321595).
Nadirbek Nurlybekov
И try/catch я убрал. В терминале протестировал, но все выполнилось без ошибок. Проблема не в try/catch.
Конечно изначальная проблема не в try/catch. Это был пример-совет на будущее.
1 ноя 16, 12:40    [19845607]     Ответить | Цитировать Сообщить модератору
 Re: Parsing JSONs  [new]
servit
Member

Откуда: г. Кишинёв, Республика Молдова
Сообщений: 3041
Блог
Nadirbek Nurlybekov,

Сделал тестовый пример клиента/сервера под REST.
JSON формирую двумя способами: по-новому и через %ZEN.proxyObject.
+ Код
Class tmp.rest Extends %CSP.REST
{

Parameter CHARSET = "UTF-8";

Parameter CONTENTTYPE = {..#CONTENTTYPEJSON};

Parameter CONVERTINPUTSTREAM = {$$$YES};

XData UrlMap [ XMLNamespace "http://www.intersystems.com/urlmap" ]
{
<
Routes>
  <
Route Url="/rest/json/test1" Method="GET" Call="Test1"/>
  <
Route Url="/rest/json/test2" Method="GET" Call="Test2"/>
  <
Route Url="/" Method="GET" Call="MainPage"/>  
</
Routes>
}

ClassMethod Test1() As %Status
{
  
{
    
"Binary":("CachéHelloПривет"_$c(661)),
    
"Password":("vØ\x02$aÉ¥ÕOùû¤F")
    
}.%ToJSON()
  
q $$$OK
}

ClassMethod Test2() As %Status
{
  
obj=##class(%ZEN.proxyObject).%New()
  
obj.Binary="CachéHelloПривет"_$c(661)
  
obj.Password="vØ\x02$aÉ¥ÕOùû¤F"
  
obj.%ToJSON(,"aelos")
  
  
q $$$OK
}

ClassMethod MainPage() As %Status
{
  
#dim %response As %CSP.Response
  
%response.ContentType="text/html"
  
&html<<!DOCTYPE html>
<
html>
  <
head>
    <
meta charset="UTF-8">
    <
meta http-equiv="X-UA-Compatible" content="IE=edge"/>
    <
script type="text/javascript">
    
function test()
    {
      
var xhr new XMLHttpRequest();
      xhr.open(
'GET','rest/json/test1',false); 
      xhr.send();
      
var res1 xhr.responseText, json1 JSON.parse(res1);
      xhr.open(
'GET','rest/json/test2',false); 
      xhr.send();
      
var res2 xhr.responseText, json2 JSON.parse(res2);
      alert(
      
'res1=' res1 '\nres2=' res2 +
      
'\n\njson1.Password=' json1.Password '\njson2.Password=' json2.Password +
      
'\n\njson1.Binary=' json1.Binary '\njson2.Binary=' json2.Binary
      );
    }
  </
script>
  </
head>
  <
body><button onclick="test()">Получить JSON</button></body>
</
html>>
  
q $$$OK
}

}
На клиенте полученный JSON парсится без ошибок.

К сообщению приложен файл. Размер - 11Kb
1 ноя 16, 17:03    [19847389]     Ответить | Цитировать Сообщить модератору
 Re: Parsing JSONs  [new]
Nadirbek Nurlybekov
Member

Откуда:
Сообщений: 5
servit,
Большое вам спасибо!!!
2 ноя 16, 12:59    [19850376]     Ответить | Цитировать Сообщить модератору
Все форумы / Caché Ответить