【问题标题】:Trying to get lotusscript json reader试图获得lotusscript json阅读器
【发布时间】:2016-04-24 06:28:01
【问题描述】:

通过 LotusScript,我正在使用一个返回 json 值的网页,除了来自 openntf 的 ls.snapps.JSONReader 之外,我无法找到任何用于 lotusscript 的库。它有效,但文档有限。我在读取值列表中的嵌套数组时遇到问题。我能够使用 ibm.common.utils.... 库让它在 java 中工作,但在使用 mac 客户端和另一个库 (javax.swing.*) 时遇到问题,所以我切换到 LotusScript。

我希望其他人对 ls.snapps.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")

将返回一个“真”值

有没有人用过这个 JSON 解析器,你能给我一些关于如何获取数据的建议吗?


更新和临时解决方案: 要获取 json 值,我必须做以下两件事之一:

这里是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" )

关于上述内容的重要说明,在数组字符串中,我必须删除括号 [ 和 ],因为我在 java 中遇到了 SBT 数组不兼容错误。我认为这样做可能会将其变成一个单层对象,但是如果您从上面的 URL 中查看 Paul 的示例,您会发现他也没有将它们添加到他的示例中。

我宁愿在所有 Java 或所有 LotusScript 中执行此操作,并且可能会将修改后的 json 字符串与 snapps 一起使用,只是寻找更好的解决方案。

【问题讨论】:

  • 您能解释一下检查 vPieces 时会发生什么吗?
  • 对于一维,vresults 是一个变体,它是一个包含 7 个成员(M_DATA、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 是一个 VARIANT,它包含 1 个 VARIANT [0] AND VALUE [7,"",0],并且项目 [0] 包含 7 个项目(M_VDATA、M_ICOUNT ...等),其中 M_VDATA 是一个包含名称的变体列表/值对。

标签: lotus-notes lotusscript


【解决方案1】:

这是您的 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  

【讨论】:

  • Murugavel,这行得通,非常感谢。但是,我如何从特定行中获取特定值?我是否需要填充一个多维数组,然后从那里提取值?或者,有没有办法告诉它获得第 1 行,蓝色的值?现在我正在处理 1 行数据,但以后可能会有很多行。类似 'vRow = sJson.getFirstItem()' 或 vRow=sJson.getItemValue("colorsArray") 然后使用 vRow.getitemValue("blue")。我可以遍历这些值,然后挑选出我想要的,但希望有一种方法可以告诉它行和项目名称。再次感谢
  • 嗨,为 Items 对象使用下标。见下文。 codeMsgbox vResultData.Items(0).GetItemValue("red")code
猜你喜欢
  • 1970-01-01
  • 2021-03-19
  • 1970-01-01
  • 2020-01-22
  • 1970-01-01
  • 2019-02-02
  • 2012-09-23
  • 1970-01-01
相关资源
最近更新 更多