Как добавить объект JSON в переменную области в Java?

я использовал много объектов JSON в applicationScope, sessionScope и viewScope для отслеживания связанных данных. Писать и читать их в SSJS очень просто:'

//Create a app scope variable
applicationScope.put("myvarname", {p1:"part 1", p2:"part2"});

// read and use the app scope variable ...
var myvar = applicationScope.get("myvarname");
//Work with parts as myvar.p1, myvar.p2, etc...

в коде Java, который я писал, я научился читать эти переменные, которые были написаны с помощью SSJS с помощью com.компания IBM.язык JScript.станд.Пакет ObjectObject с таким кодом:

ObjectObject myvar = (ObjectObject) ExtLibUtil
        .getApplicationScope().get(dbkey);
FBSValue localFBS = myvar.get("p1");
String myp1 = localFBS.stringValue();
localFBS = myvar.get("p2");
String myp2 = localFBS.stringValue();

теперь, конечно, я хочу написать новую запись, используя Java Bean, который затем может быть прочитан SSJS и другие Java-бобы таким же образом. Мне удалось записать в область с помощью карты и хэш-таблицы, но они разрушают логику при попытке чтения с помощью ObjectObject.

Итак, как я могу создать новую запись в области с помощью пакетов ObjectObject и/или FBSValue? Я не могу найти, как создать новый FBSValue, который затем может быть добавлен в ObjectObject. Я уверен, что это простая вещь, которую упустили такие новички, как я.

/ Newbs

1 ответов


вы можете построить пустой ObjectObject, заполнить его FBSValues и просто поместить его непосредственно в карту области:

ObjectObject myvar = new ObjectObject();
try {
    myvar.put("p1", FBSUtility.wrap("part 1"));
    myvar.put("p2", FBSUtility.wrap("part 2"));
} catch (InterpretException e) {
    e.printStackTrace();
}
Map<String, Object> applicationScope = ExtLibUtil.getApplicationScope();
applicationScope.put("myvarname", myvar);

при извлечении его позже (как в приведенных примерах), SSJS увидит его как JSON, Java увидит его точно так же, как он был сохранен.

Если вам нужно хранить более глубокие иерархии, вы можете поместить экземпляры ArrayObject и ObjectObject внутри ObjectObject в дополнение к примитивам, поэтому, как и сам JSON, вы можете вложить их так глубоко, как тебе нужно.

просто не забудьте включить только true JSON (строки, числа, логические значения, массивы, объекты), если вы будете хранить его в любом месте выше requestScope; в частности, FunctionObject не реализует сериализуемый, поэтому JSON безопасно хранить, JavaScript нет. Строго говоря, это становится токсичным только при хранении в viewScope в 8.5.2 и 8.5.3 (и даже тогда, только когда параметр персистентности приложения не настроен на сохранение всех страниц в памяти.) Но если IBM когда-либо реализует поддержку кластеров, то все объекты, хранящиеся в sessionScope и applicationScope, должны быть сериализуемы для обеспечения межсерверного транспорта состояний... таким образом, в интересах будущей проверки дизайна разумно придерживаться этого принципа для всего, что хранится дольше, чем продолжительность одного запроса.