Lotus notes 尝试获取lotusscript json读取器
通过LotusScript,我正在使用一个返回json值的网页,除了openntf中的ls.snaps.JSONReader之外,我一直找不到LotusScript的任何库。它可以工作,但文档是有限的。读取值列表中的嵌套数组时遇到问题。我能够使用ibm.common.utils使它在java中工作。。。。但是在mac客户端和另一个库(javax.swing.*)上遇到了问题,所以我切换到LotusScript 我希望其他人有使用ls.snaps.JSONReader库的经验,或者对如何实现这一点有不同的想法。以下是示例: 我用Lotus notes 尝试获取lotusscript json读取器,lotus-notes,lotusscript,Lotus Notes,Lotusscript,通过LotusScript,我正在使用一个返回json值的网页,除了openntf中的ls.snaps.JSONReader之外,我一直找不到LotusScript的任何库。它可以工作,但文档是有限的。读取值列表中的嵌套数组时遇到问题。我能够使用ibm.common.utils使它在java中工作。。。。但是在mac客户端和另一个库(javax.swing.*)上遇到了问题,所以我切换到LotusScript 我希望其他人有使用ls.snaps.JSONReader库的经验,或者对如何实现这一点
Dim jsonReader As jsonReader
Dim vResults As Variant
Dim vPieces As Variant
Dim sJSON As string
sJson= |{ "colorsArray":[{
"red":"#f00",
"green":"#0f0",
"blue":"#00f",
"cyan":"#0ff",
"magenta":"#f0f",
"yellow":"#ff0",
"black":"#000"
}
]
}|
Set jsonReader = New JsonReader
Set vResults = jsonReader.parse(sJson)
vPieces = vResults.items
设置单个级别对象时没有问题,例如:
sJSON = |{"a":"a4255524","a24":true,"ax":"WER!!","b":"Some text"}|
我使用getItemValue方法
msgbox vResults.getitemValue("a24")
将返回“true”值
有人使用过这个JSON解析器吗?你能给我一些关于如何获取数据的建议吗
更新和临时解决方案: 要获取json值,我必须做以下两件事之一:
- 使用ls Replace函数提取一维数据(即,删除{“colorsArray”:[在左侧和]}在右侧),然后使用snapps json读取器
- 我使用SBT JSON库创建了一个java库,并从LotusScript调用它
import com.ibm.commons.util.io.json.JsonException;
import com.ibm.commons.util.io.json.JsonJavaFactory;
import com.ibm.commons.util.io.json.JsonJavaObject;
import com.ibm.commons.util.io.json.JsonParser;
import com.ibm.sbt.services.client.base.datahandlers.JsonDataHandler;
import lotus.domino.*;
public class GetJSON extends AgentBase {
public static String pJSON( String jData, String jEntry, String jValue ) {
String result2="";
try {
System.out.println("data: " + jData + "\n" + "\n" + "jEntry & jValue: " + jEntry + ", " + jValue);
// print to debug console
// System.out.println("jData: " + jData);
JsonJavaObject jsonObject = (JsonJavaObject) JsonParser.fromJson(JsonJavaFactory.instanceEx, jData );
JsonDataHandler handler = new JsonDataHandler();
handler.setData(jsonObject);
JsonJavaObject entryJson=handler.getEntry(jEntry);
result2=entryJson.getAsString(jValue);
} catch (Exception e) {
System.out.println("Error: " + e);
e.printStackTrace();
result2="";
}
return result2; }
}
我从LotusScript中调用它,如下所示:
Option Public
Option Declare
Use "($getJson)"
UseLSX "*javacon"
Dim mySession As JavaSession
Dim myClass As JavaClass
Dim getJson As JavaObject
result = ""
'....
'add vars here
'....
Set mySession = New JavaSession()
Set myClass = mySession.GetClass("GetJSON")
Set GetJson = myClass.CreateObject()
MsgBox GetJson.pJSON( result2, "colorsArray", "red" )
重要的是,在上面的数组字符串中,我必须删除括号[and],因为我在java中遇到了一个SBT数组不兼容错误。我认为这样做可能会将它变成一个单级对象,但是如果你从上面的URL查看Paul的示例,你会发现他也没有将它们添加到他的示例中
我宁愿在所有Java或所有LotusScript中都这样做,并且可能会在snapps中使用修改后的json字符串,只是为了寻找更好的解决方案。以下是json字符串的工作代码。试试看
Dim jsonReader As JSONReader
Dim vResults As Variant
Dim vPieces As Variant
Dim sJSON As String
sJson= |{ "colorsArray":[{
"red":"#f00",
"green":"#0f0",
"blue":"#00f",
"cyan":"#0ff",
"magenta":"#f0f",
"yellow":"#ff0",
"black":"#000"
}
]}|
Set jsonReader = New JSONReader
Set vResults = jsonReader.parse(sJson)
Set vResultData = vResults.GetItemValue("colorsArray")
Forall vResult In vResultData.Items
Msgbox Cstr(vResult.GetItemValue("red"))
Msgbox Cstr(vResult.GetItemValue("green"))
Msgbox Cstr(vResult.GetItemValue("blue"))
Msgbox Cstr(vResult.GetItemValue("cyan"))
Msgbox Cstr(vResult.GetItemValue("magenta"))
Msgbox Cstr(vResult.GetItemValue("yellow"))
Msgbox Cstr(vResult.GetItemValue("black"))
End Forall
你能解释一下当你检查vPieces时会发生什么吗?对于一维vresults是一个变量,它是一个包含7个成员的列表(M_数据、M_ICOUNT、REPLACE_CR、REPLACE_BLANK,…)M_DATA是一个包含名称/值对的变量列表。这是一个我没有问题的示例。对于2级对象,VPIECES是一个变量对象,有1个值,colorsArray(variant),但有5个成员(M_VDATA、M_ICOUNT、M_STHREADLIST、M_SERRORMESSAGE、M_IERRORCOUNT)。M_VDATA是一个包含1个变量[0]和值[7,“,0]的变量,项[0]包含7项(M_VDATA、M_ICOUNT…等)其中M_VDATA是一个包含名称/值对的变量列表。Murugavel,这很有效,非常感谢。但是,我如何从特定行获取特定值?我是否需要填充多维数组,然后从那里提取值?或者,有没有办法告诉它获取第1行,蓝色值?现在我正在处理1行的值数据,但后面可以是多行。类似于“vRow=sJson.getFirstItem()”或vRow=sJson.getItemValue(“colorsArray”),然后使用vRow.getItemValue(“蓝色”)。我可以遍历这些值,然后选择我想要的内容,但我希望有一种方法可以告诉它行和项目名称。再次感谢您,使用Items对象的下标。请参见下面。
code
Msgbox vResultData.Items(0)。GetItemValue(“红色”)code