Гость
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Parsing JSONs / 19 сообщений из 19, страница 1 из 1
31.10.2016, 13:30
    #39337862
Nadirbek Nurlybekov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Parsing JSONs
Здравствуйте, коллеги! Есть проблема с парсингом json-ов, сгенерированых с помощью метода %ToJSON() системного класса %ZEN.proxyObject. После того, как клиент получил данные, выводится ошибка

Код: plaintext
"Error: JSON.parse: bad escaped character at line 5 column 19 of the JSON data".
Код метода на клиенте:
Код: plaintext
1.
$http.get("/rest/json/persons").then(function(response) {
  $scope.persons = response.data; }); 
Генерация json-ов на сервере:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
  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
...
Рейтинг: 0 / 0
31.10.2016, 14:07
    #39337914
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Parsing JSONs
Nadirbek Nurlybekov , так ты вызови ту страничку прямо в браузере и посмотри чего там тебе нагененрили... ;)
...
Рейтинг: 0 / 0
31.10.2016, 14:12
    #39337922
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Parsing JSONs
Nadirbek Nurlybekov ,

По умолчанию %ToJSON() использует формат "aelotw". Попробуйте "aelotwu".
Код: plaintext
u - output pre-converted to UTF-8 instead of in native internal format
...
Рейтинг: 0 / 0
31.10.2016, 14:15
    #39337927
Nadirbek Nurlybekov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Parsing JSONs
krvsa,

В браузере ничего не выводится. В консоли браузера выводится та ошибка.
...
Рейтинг: 0 / 0
31.10.2016, 14:29
    #39337954
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Parsing JSONs
Nadirbek Nurlybekovkrvsa,

В браузере ничего не выводится. В консоли браузера выводится та ошибка.Для тестирования браузер необязателен: 17321595
Смотрите что формируется на сервере прямо на сервере.
...
Рейтинг: 0 / 0
31.10.2016, 15:23
    #39338014
Nadirbek Nurlybekov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Parsing JSONs
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":""
}
]
}
...
Рейтинг: 0 / 0
31.10.2016, 15:34
    #39338036
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Parsing JSONs
Nadirbek NurlybekovВ браузере ничего не выводится.
Так ты не тот адрес поди смотришь... Ты указывай адрес своего запроса.
...
Рейтинг: 0 / 0
31.10.2016, 15:40
    #39338042
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Parsing JSONs
Nadirbek Nurlybekovservit,
Вот что мне выдал сервер:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
{
        "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":""
                }
        ]
}


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

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
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);
...
Рейтинг: 0 / 0
31.10.2016, 15:40
    #39338043
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Parsing JSONs
Nadirbek NurlybekovСгенерацией json-ов нет проблем. Именно с парсинг не работает на клиенте. Вот что мне выдал сервер:И как видим сервер сгенерировал поле Password с кракозябрами. Подозреваю, что это бинарные данные.
Это при каком формате %ToJSON()? Приведите пример json с "u" и без.
...
Рейтинг: 0 / 0
31.10.2016, 15:48
    #39338055
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Parsing JSONs
krvsaВполне вменяемый вариант... Все работает нормальноВменяемый для кого: клиента или сервера?
Вряд ли javascript понимает встроенный внутренний формат Caché (native internal format), используемый по умолчанию.
...
Рейтинг: 0 / 0
31.10.2016, 15:55
    #39338066
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Parsing JSONs
servitВменяемый для кого: клиента или сервера?
Я привел пример JS-программы...
Все выводится в консоль браузера без проблем.
...
Рейтинг: 0 / 0
31.10.2016, 16:07
    #39338083
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Parsing JSONs
krvsaЯ привел пример JS-программы...
Все выводится в консоль браузера без проблем.Вы привели некорректный пример.
Данные Вы передаёте с клиента на клиент, а надо с сервера на клиент. Кроме того у Вас пароли уже экранированы, тогда как у ТС - нет.ВикипедияСтрока — это упорядоченное множество из нуля или более символов юникода, заключенное в двойные кавычки. Символы могут быть указаны с использованием escape-последовательностей, начинающихся с обратной косой черты «\» (поддерживаются варианты \", \\, \/, \t, \n, \r, \f и \b), или записаны шестнадцатеричным кодом в кодировке UTF-8 в виде \uFFFF proof .
...
Рейтинг: 0 / 0
31.10.2016, 16:27
    #39338123
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Parsing JSONs
servitВы привели некорректный пример.
Какой автор тут предоставил - такой я и дал.
Другого у меня нет.
...
Рейтинг: 0 / 0
31.10.2016, 16:46
    #39338144
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Parsing JSONs
krvsaservitВы привели некорректный пример.
Какой автор тут предоставил - такой я и дал.
Другого у меня нет.Автор предоставил JSON, который:
  • он формирует на сервере
  • JSON без экранирования и в этом как раз и заключается проблема автора
  • этот JSON клиент не понимает, потому что он неэкранирован
  • формируете его на клиенте
  • JSON Ваш внезапно уже экранирован
  • клиент его внезапно понимает.
  • ...
    Рейтинг: 0 / 0
    01.11.2016, 09:37
        #39338499
    servit
    Участник
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Parsing JSONs
    Nadirbek Nurlybekov ,

    Если Вы используете try/catch и внутри вызываете метод, возвращающий %Status, а не исключение, то ошибка не перехватится.
    Код: plaintext
    1.
    2.
    3.
    4.
    5.
    6.
    7.
    8.
    9.
    10.
    11.
    12.
    13.
    14.
    15.
    16.
    17.
    18.
    19.
    20.
    21.
    22.
    23.
    24.
    25.
    26.
    27.
    28.
    29.
    30.
    Class tmp.test [ Abstract ]
    {
    
    ClassMethod MyError() As %Status [ Internal, Private ]
    {
      q $$$ERROR($$$NotImplemented)
    }
    
    ClassMethod Test(b As %Boolean = {$$$YES})
    {
      ;d ##class(tmp.test).Test()
      
      #dim ex As %Exception.AbstractException
      try{
        if b {
          s tSC=..MyError()
        } else {
          $$$ThrowOnError(..MyError())
        }
      }catch(ex) {
        w ex.DisplayString(),!
      }
    }
    }
    
    ------------------------------------
    
    USER>d ##class(tmp.test).Test()
     
    USER>d ##class(tmp.test).Test(0)
    ОШИБКА #5003: Не реализовано
    ...
    Рейтинг: 0 / 0
    01.11.2016, 11:59
        #39338683
    Nadirbek Nurlybekov
    Гость
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Parsing JSONs
    servitПриведите пример json с "u" и без.А как это делать? Код %ToJSON() посмотрел. В его аргументах стоит вот что:

    Method %ToJSON(pLevel As %Integer = 0, pFormat As %String = "aelotw") As %Status [ Internal 

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

    krvsa,

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

    Как мне перевести объекты в json-ы, понимающий javascript?
    ...
    Рейтинг: 0 / 0
    01.11.2016, 12:40
        #39338743
    servit
    Участник
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Parsing JSONs
    Nadirbek NurlybekovА как это делать?
    А "u" здесь не предусмотрено.По умолчанию если не передавать параметры, используются соответственно 0 и "aelotw", но можно их задать с другими значениями (см. 17321595 ).
    Nadirbek NurlybekovИ try/catch я убрал. В терминале протестировал, но все выполнилось без ошибок. Проблема не в try/catch.Конечно изначальная проблема не в try/catch. Это был пример-совет на будущее.
    ...
    Рейтинг: 0 / 0
    01.11.2016, 17:03
        #39339170
    servit
    Участник
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Parsing JSONs
    Nadirbek Nurlybekov ,

    Сделал тестовый пример клиента/сервера под REST.
    JSON формирую двумя способами: по-новому и через %ZEN.proxyObject.
    Код
    Код: plaintext
    1.
    2.
    3.
    4.
    5.
    6.
    7.
    8.
    9.
    10.
    11.
    12.
    13.
    14.
    15.
    16.
    17.
    18.
    19.
    20.
    21.
    22.
    23.
    24.
    25.
    26.
    27.
    28.
    29.
    30.
    31.
    32.
    33.
    34.
    35.
    36.
    37.
    38.
    39.
    40.
    41.
    42.
    43.
    44.
    45.
    46.
    47.
    48.
    49.
    50.
    51.
    52.
    53.
    54.
    55.
    56.
    57.
    58.
    59.
    60.
    61.
    62.
    63.
    64.
    65.
    66.
    67.
    68.
    69.
    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
    {
      w {
        "Binary":("CachéHelloПривет"_$c(661)),
        "Password":("vØ\x02$aÉ¥ÕOùû¤F")
        }.%ToJSON()
      q $$$OK
    }
    
    ClassMethod Test2() As %Status
    {
      s obj=##class(%ZEN.proxyObject).%New()
      s obj.Binary="CachéHelloПривет"_$c(661)
      s obj.Password="vØ\x02$aÉ¥ÕOùû¤F"
      d obj.%ToJSON(,"aelos")
      
      q $$$OK
    }
    
    ClassMethod MainPage() As %Status
    {
      #dim %response As %CSP.Response
      s %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 парсится без ошибок.
    ...
    Рейтинг: 0 / 0
    02.11.2016, 12:59
        #39339857
    Nadirbek Nurlybekov
    Гость
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Parsing JSONs
    servit,
    Большое вам спасибо!!!
    ...
    Рейтинг: 0 / 0
    Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Parsing JSONs / 19 сообщений из 19, страница 1 из 1
    Целевая тема:
    Создать новую тему:
    Автор:
    Найденые пользователи ...
    Разблокировать пользователей ...
    Читали форум (0):
    Пользователи онлайн (0):
    x
    x
    Закрыть


    Просмотр
    0 / 0
    Close
    Debug Console [Select Text]