2016-04-24 127 views
1

通过LotusScript我正在使用返回json值的网页,并且我一直无法从lotntcript找到任何库,除了来自openntf的ls.snapps.JSONReader。它可以工作,但文档是有限的。我无法读取值列表中的嵌套数组。我可以使用ibm.common.utils ....库使其在java中工作,但在使用mac客户端和另一个库(javax.swing。*)时遇到了问题,因此我切换到了LotusScript。试图获取lotusscript json reader

我希望别人有经验与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解析器,你可以给我一些关于如何获取数据的建议吗?


UPDATE和临时解决方案: 要获得的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数组不兼容性错误。我认为这样做可能会把它变成一个单独的对象,但是如果你从Paul的上面的例子中看到Paul的例子,你会发现他并没有将它们添加到他的例子中。

我宁愿在所有Java或所有LotusScript中都这样做,并且可能会使用带有snapps的修改过的json字符串,只是寻找更好的解决方案。

+0

你能解释一下当你检查vPieces时会发生什么吗? –

+0

对于1维vresults是带有7个成员(M_DATA,M_ICOUNT,REPLACE_CR,REPLACE_BLANK,...)的列表的变体M_DATA是包含名称/值对的变体列表。这是我没有问题的例子。 2级对象VPIECES是具有1个值的颜色阵列(VARIANT),但有5个成员(M_VDATA,M_ICOUNT,M_STHREADLIST,M_SERRORMESSAGE,M_IERRORCOUNT)的变体对象。 M_VDATA是包含1个VARIANT [0]和VALUE [7,“”,0]的VARIANT,并且项目[0]包含7个项目(M_VDATA,M_ICOUNT ...等),其中M_VDATA是包含名称/值对。 – carlo

回答

3

以下是您的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 
+0

Murugavel,很有用,非常感谢。但是,我如何从特定行中获取特定值?我需要填充一个多维数组,然后从那里拉取值?或者,有没有办法让它获得第1行,蓝色的值?现在我正在处理一行数据,但后来可能会有很多行。 喜欢的东西 'VROW = sJson.getFirstItem()' 或 VROW = sJson.getItemValue( “colorsArray”),然后使用 vRow.getitemValue( “蓝”)。 我可以通过值迭代,然后挑选出我想要的,但希望有一种方法来告诉它的行和项目名称。再次感谢 – carlo

+0

嗨, 为Items对象使用下标。见下文。 'code'Msgbox vResultData.Items(0).GetItemValue(“red”)'code' –