Гость
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / CSP. JSON. / 25 сообщений из 37, страница 1 из 2
05.06.2012, 09:23
    #37825285
Darkhan Darkhan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CSP. JSON.
Посмотрел в этом форуме статьи про JSON в CSP. Но ничего путного не нашел.
Есть ли в Cache адаптер JSON для CSP? Может у кого-то свои собственно ручно сделанные адаптеры. Поделитесь, плз.

Когда через Аякс посылаю запрос Cache: data: в формате JSON. Он понимает данные ввиде: "имя":"значение". Но не понимает массивы.

P.S. Если вопрос не слишком корректен не пинайте сильно, пожалуйста. Думаю смысл вопроса понятен.
...
Рейтинг: 0 / 0
05.06.2012, 09:41
    #37825313
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CSP. JSON.
Darkhan Darkhan , чем провинились гипперэвенты? Почему не используешь их?
...
Рейтинг: 0 / 0
05.06.2012, 09:44
    #37825319
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CSP. JSON.
Darkhan Darkhan ,

Bill McCormickIf all you want is to mess with JSON then you can use the lowlevel APIs in the JSON Provider class. There are functions to convert arrays or objects in to JS that will instantiate a JSON object. And there are others that will take a JSON object from JS and convert it to an array in memory in COS. If that is all you are after have at it.

Источник: zen.component on csp.page %ZEN.Auxiliary.jsonProvider
...
Рейтинг: 0 / 0
05.06.2012, 09:53
    #37825332
DAiMor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CSP. JSON.
ZEN JSON, работает только в одну сторону, и выводит JSON в текущий поток
попробуйте это , у себя использую его.
...
Рейтинг: 0 / 0
05.06.2012, 10:44
    #37825447
doublefint
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CSP. JSON.
DAiMor, почему только в одну сторону? В коде класса %ZEN.Auxiliary.jsonProvider есть внутренние методы %ObjectToJSON и %ParseJSON. Правда нет уверенности, что реализация совпадает со стандартом
...
Рейтинг: 0 / 0
05.06.2012, 10:46
    #37825451
doublefint
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CSP. JSON.
Darkhan Darkhan, кстати метод %ArrayToJSON там тоже есть
...
Рейтинг: 0 / 0
05.06.2012, 11:06
    #37825492
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CSP. JSON.
Ещё много методов " Low Level JSON Support " можно найти в файле zenCSLM.js .
...
Рейтинг: 0 / 0
05.06.2012, 11:16
    #37825516
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CSP. JSON.
ДокументацияThe Zen <jsonProvider> component provides a way to transport object data between a server and client , or between client and server , using JavaScript Object Notation (JSON) format.
Источник: Zen JSON Component


И ещё (ссылку приводил выше):
The jsonProvider component provides a way to transport object data between a server and client ( and vice versa ) using JavaScript Object Notation (so-called JSON format).
...
Рейтинг: 0 / 0
05.06.2012, 11:25
    #37825535
Darkhan Darkhan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CSP. JSON.
Всем спасибо за отзывчивость. Сейчас рассмотрю предложенные варианты.

Но мне нужно использовать это в CSP (не ZEN).
...
Рейтинг: 0 / 0
05.06.2012, 13:34
    #37825847
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CSP. JSON.
Darkhan DarkhanНо мне нужно использовать это в CSP (не ZEN).
Так чем не угодили гиппер эвенты?
...
Рейтинг: 0 / 0
05.06.2012, 13:44
    #37825885
DAiMor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CSP. JSON.
krvsaDarkhan DarkhanНо мне нужно использовать это в CSP (не ZEN).
Так чем не угодили гиппер эвенты?
гипер евенты много чем могут не угодить, да и связь какая между JSON и HyperEvent ?

для гипер евентов нужно, держать настроенной область csp, а когда для безопасности хочется все прикрыть приходится выделываться.
при переходе с 2008 на 2010. возникла проблема, клиентам приходилось вымудрятся с настройкой IIS (Apache), да и мне самому на разработческой машине. настраивать так чтобы не пересекалась папка CSP для разных версий Cache, так как гиперевенты там не совместимы. И у меня в своем приложении тоже есть желание напрочь отказаться от использования гиперевентов.
а еще сложность отладки, сложно понять по вызову гиперевента куда он все таки уйдет (класс, метод)
в общем я для себя решил что гиперевенты-зло, и ни кому бы не советовал их использовать.
...
Рейтинг: 0 / 0
05.06.2012, 13:57
    #37825923
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CSP. JSON.
DAiMorв общем я для себя решил что гиперевенты-зло, и ни кому бы не советовал их использовать.
Х/з за что ты так на них жлобанул...
...
Рейтинг: 0 / 0
05.06.2012, 14:00
    #37825933
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CSP. JSON.
DAiMorсвязь какая между JSON и HyperEvent ?
Суть одна... Передача/получение данных.
...
Рейтинг: 0 / 0
05.06.2012, 15:15
    #37826099
DAiMor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CSP. JSON.
krvsaDAiMorсвязь какая между JSON и HyperEvent ?
Суть одна... Передача/получение данных.
тогда встречный вопрос,
как организовать передачу/возврат гиперевентами сложных структур данных:
объект с несколькими свойствами, некоторые свойства которого могут быть массивами?
и еще чтобы было просто получить на любой из сторон (сервер/клиент), удобный формат для обработки
...
Рейтинг: 0 / 0
05.06.2012, 15:49
    #37826183
Блок А.Н.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CSP. JSON.
Не самый лучший способо, наверно, но я записью в текущее устройство вывода внутри гиперевента формирую яваскрипт.
...
Рейтинг: 0 / 0
05.06.2012, 15:50
    #37826186
kolesov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CSP. JSON.
DAiMorкак организовать передачу/возврат гиперевентами сложных структур данных:
объект с несколькими свойствами, некоторые свойства которого могут быть массивами?
и еще чтобы было просто получить на любой из сторон (сервер/клиент), удобный формат для обработки

Я делаю так.
С клиента передаю на сервер (гиперивентом) указатель на объект DOM (js).
Методом сервера (посредством &js<>) наполняю мой переданный js объект данными и поведением любой сложности, доступной в рамках js и DOM.
Возвращаю на клиент "пусто" (или ошибку, если что-то пошло не так).

В итоге, сразу после выполнения метода на стороне сервера имею на клиенте объект, содержащий сколь угодно сложную структуру (к примеру со свойством, представляющим из себя массив объектов, каждый из которых содержит набор массивов данных и т.д. и т.п. + измененное в соответствии с инструкциями сервера поведение объекта на странице - новые и измененные методы).

ЗЫ: Это не к тому, что JSON - плохо. Скорее наоборот - очень удачная идея, считаю. Так же как и вообще REST, который уже кажется всем показал, как нас смешно развели когда-то с xml, soap, wsdl etc. Ведь повелись в свое время - как кролики. Нет бы стандарты читать и использовать ;) И вообще, вот это "Суть одна... Передача/получение данных." наводит на размышления о том, почему клавиш 104, монитор квадратный, и рук две - "суть"-то одна - никем не доказано, что треугольный монитор не дает возможности работать с гуи... но, почему-то таковых не наблюдается, а вот изыски в изготовлении софта, в т.ч. способов "передачи/получения данных", изобилуют ;) Так что, имхо, суть далеко не одна...
...
Рейтинг: 0 / 0
05.06.2012, 17:57
    #37826451
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CSP. JSON.
Darkhan DarkhanВсем спасибо за отзывчивость. Сейчас рассмотрю предложенные варианты.

Но мне нужно использовать это в CSP (не ZEN).
doublefint привёл некоторые методы из класса %ZEN.Auxiliary.jsonProvider , которые можно вызывать из CSP, например:
Пример на ZENClass SqlRu.test Extends %ZEN.Component.page
{

/// Comma-separated list of additional JS include files for the page.
Parameter JSINCLUDES As STRING = "zenCSLM.js";

XData Style
{
<style type="text/css">
/* establish size of finder */
#finder {
  border: 1px solid black;
  width: 900px;
  height: 400px;
  overflow-x: auto;
  overflow-y: hidden;
  background: rgb(180,190,200);
}

/* fix width/height of each finder column */
.finderColumn {
  width: 300px;
  height: 400px;
}
</style>
}

XData Contents [ XMLNamespace = " http://www.intersystems.com/zen"  ]
{
<page xmlns=" http://www.intersystems.com/zen"  title="" height="100%">
<jsonProvider id="json" OnGetArray="GetFinderArray"/>
<finderPane id="finder" ongetdata="return zen('json').getContentObject();"/>
<button caption="test" onclick="zenPage.test();"/>
</page>
}

ClientMethod test() [ Language = javascript ]
{
  zenAlert(ZLM.jsonEncode(zen('json').getContentObject()));
}

/// Provide the source data (as an array) that will drive the finder.
Method GetFinderArray(
  ByRef pParameters,
  Output pMetaData,
  Output pData) As %Status
{
  // The MetaData list specifies the names of the properties of the 
  // JavaScript objects and the order in which they appear within
  // nodes of the data array.
  Set pMetaData = $LB("name","title","supervisor","phoneNo")

  // create a random org chart
  Set d = 0
  For tDept = "Sales","Marketing","Engineering","HR","Finance" {
    // add top-level entry for each department
    Set d = d + 1
    Set pData(d) = $LB(tDept) // name, but no other properties

    // add executive to each dept
    Set tVPName = ##class(%PopulateUtils).Name()
    Set pData(d,1) = $LB(tVPName,"Vice President, "_ tDept)

    // add 2nd level managers
    For n = 1:1:($R(10)+2) {
      Set tMgrName = ##class(%PopulateUtils).Name()
      Set pData(d,1,n) = $LB(tMgrName,"Manager",tVPName)

      // add workers
      For w = 1:1:($R(25)+2) {
        Set tWkrName = ##class(%PopulateUtils).Name()
        Set tTitle = ##class(%PopulateUtils).Title()
        Set pData(d,1,n,w) = $LB(tWkrName,tTitle,tMgrName)
      }

    }
  }
  Quit $$$OK
}

}
Аналог на CSP<CSP:CLASS INCLUDES="%callout">
<html>
<head>
<title></title>
<script type="text/javascript" src="zenutils.js"></script>
<script type="text/javascript" src="zenCSLM.js"></script>

<script language="cache" method="GetFinderArray" arguments="&pMetaData,&pData" returntype="%Status">
  
  
  new d,tDept,tVPName,n,tMgrName,tWkrName,tTitle
  
  // The MetaData list specifies the names of the properties of the 
  // JavaScript objects and the order in which they appear within
  // nodes of the data array.
  Set pMetaData = $LB("name","title","supervisor","phoneNo")

  // create a random org chart
  Set d = 0
  For tDept = "Sales","Marketing","Engineering","HR","Finance" {
    // add top-level entry for each department
    Set d = d + 1
    Set pData(d) = $LB(tDept) // name, but no other properties

    // add executive to each dept
    Set tVPName = ##class(%PopulateUtils).Name()
    Set pData(d,1) = $LB(tVPName,"Vice President, "_ tDept)

    // add 2nd level managers
    For n = 1:1:($R(10)+2) {
      Set tMgrName = ##class(%PopulateUtils).Name()
      Set pData(d,1,n) = $LB(tMgrName,"Manager",tVPName)

      // add workers
      For w = 1:1:($R(25)+2) {
        Set tWkrName = ##class(%PopulateUtils).Name()
        Set tTitle = ##class(%PopulateUtils).Title()
        Set pData(d,1,n,w) = $LB(tWkrName,tTitle,tMgrName)
      }

    }
  }
  
  /*
  
  или
  
  Set pMetaData = $LB("name","rank","serialNo")
  Set pData(1) = $LB("Smith","Captain","444-33-2222")
  Set pData(1,1) = $LB("Jones","Corporal","333-22-3333")  
  */
  Quit $$$OK
</script>

  <script language="cache" method="SrvTest" returntype="%String">
  new format,tIO,tXDEV,export,tChunk
  
  do ..GetFinderArray(.pMetaData,.pData)
  
  // собираем в строку всё, что выводится через write
  
  set tIO=$IO,tXDEV="|XDEV|"_+$JOB,$ZT="Trap"
  Do {
    /// For $$$IsUnicode use UTF-8
    Open tXDEV:($ZF(-6,$$$XSLTLibrary,12):"":"S":/HOSTNAME="XSLT":/IOT=$S(($zcvt($get(format),"L")[",utf8")||$$$IsUnicode:"UTF8",1:"RAW"):/IBU=16384:/OBU=16384)
    Use tXDEV
    
    Quit:$$$ISERR(##class(%ZEN.Auxiliary.jsonProvider).%ArrayToJSON(.pMetaData,.pData))
    
    // Flush any remaining output
    Write *-3
    
    // Now read back a string (up to the maximum possible length, 32k or ~4MB for long strings)
    Set export = ""
    While (1) {
      #dim tChunk As %String
      Read tChunk:0
      Quit:'$L(tChunk)
      Set export = export _ tChunk
    }
    
  } While (0)

:Exit
  Close tXDEV
  Use tIO
  Quit export
:Trap
  Set $ZT=""
  Goto Exit
</script>

<script type="text/javascript">
function test()
{
  var str=#server(..SrvTest())#;
  var obj=ZLM.jsonParseObject(str);
  zenAlert("str=",str);
  zenAlert("obj=",obj);
  zenAlert("name=",obj.obj.children[0].name);

  /*
  
  можно ещё так
  
  var str2=ZLM.jsonEncode(obj,false);
  zenAlert("str2=",str2);
  */
}
</script>

</head>
<body>
  <button onclick="test();">test</button>
</body>
</html>

PS: в обратную сторону, думаю, справитесь самостоятельно.
...
Рейтинг: 0 / 0
05.06.2012, 19:10
    #37826547
doublefint
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CSP. JSON.
DAiMor тогда встречный вопрос,
как организовать передачу/возврат гиперевентами сложных структур данных:
объект с несколькими свойствами, некоторые свойства которого могут быть массивами?

Передачу, например, так:

Код: html
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.
<!DOCTYPE html>
<html><head><title>HyperEvent</title></head><body>
<button type="button" id="call">#call#</button>
<button type="button" id="server">#server#</button>
<script type="text/javascript">
var $g=function(id){return document.getElementById(id) || "" };
var $bind=("v"=="\v") ? function(o,e,h){ o.attachEvent("on"+e,h)} : function(o,e,h){o.addEventListener(e,h,false);};

window.alertType=function( arg ){
		alert( typeof( arg ) + " = " + arg  );
};

$bind(window,"load",function(){
		
		$bind( $g("call"), "click", function(){
				#call(..wNowJS("window.parent.alertType"))#
		});
		
		$bind( $g("server"), "click", function(){
				alertType( eval(#server(..gNowJS())#) );
		});
	
});

</script></body></html>
<script runat="server" language="cache" method="wNowJS" arguments='jsfunc:%String="alert"' returnType="%String">
 w ";",jsfunc,"(",..gNowJS(),");"
 Q ""
</script>
<script runat="server" language="cache" method="gNowJS" returnType="%String">
 Q "{now: ['"_$zd($zu(188),3)_"'], status: true }"
 </script>



Возврат с помощью jsonProvider
...
Рейтинг: 0 / 0
06.06.2012, 08:27
    #37826965
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CSP. JSON.
DAiMorтогда встречный вопрос,
как организовать передачу/возврат гиперевентами сложных структур данных:
объект с несколькими свойствами, некоторые свойства которого могут быть массивами?
Тут можно вспомнить старинный анекдот:
- Доктор, когда я делаю вот так (сгибается в немыслемую позу), у меня сильно болит вот тут...
- Не делайте так!

Любое большое и сложное можно разбить на много, много простых и маленьких...
...
Рейтинг: 0 / 0
06.06.2012, 08:39
    #37826973
Блок А.Н.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CSP. JSON.
krvsa,

Минусы:
- много обработки на клиенте,
- много обращений к серверу, которые будут нагружать шлюз.
...
Рейтинг: 0 / 0
06.06.2012, 10:09
    #37827061
DAiMor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CSP. JSON.
krvsaDAiMorтогда встречный вопрос,
как организовать передачу/возврат гиперевентами сложных структур данных:
объект с несколькими свойствами, некоторые свойства которого могут быть массивами?
Тут можно вспомнить старинный анекдот:
- Доктор, когда я делаю вот так (сгибается в немыслемую позу), у меня сильно болит вот тут...
- Не делайте так!

Любое большое и сложное можно разбить на много, много простых и маленьких...
эмм, что может быть проще
на клиенте
Код: javascript
1.
2.
var ask = JSON.stringify(obj) // получили из любого сложного объекта JSON строку которую можно передать на сервер
var obj = JSON.parse(reply)  // получили из ответа сервера в формате JSON, любой сложный объект


на сервере
Код: sql
1.
2.
set obj = ##class(JSON).Decode(ask) // Получим объект Cache, с удобной многомерной структурой типа %ArrayOfDataTypes(объект со свойствами) или %ListOfDataTypes(массив)
set reply = ##class(JSON).Encode(obj) // сформируем JSON ответ, браузеру
...
Рейтинг: 0 / 0
06.06.2012, 11:53
    #37827268
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CSP. JSON.
DAiMorэмм, что может быть проще
Выглядит не плохо...
...
Рейтинг: 0 / 0
06.06.2012, 12:56
    #37827446
doublefint
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CSP. JSON.
krvsa, *(если IE >= 8 ;)
...
Рейтинг: 0 / 0
06.06.2012, 13:02
    #37827460
doublefint
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CSP. JSON.
krvsa, вот тут подробнее
...
Рейтинг: 0 / 0
06.06.2012, 13:23
    #37827518
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CSP. JSON.
doublefint , я пока обходился и без этого...
Но на заметочку возьму конечно.
...
Рейтинг: 0 / 0
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / CSP. JSON. / 25 сообщений из 37, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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