Lotus notes 尝试获取lotusscript json读取器

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库的经验,或者对如何实现这一点

通过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调用它

以下是java代码:

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