我在开发中使用grails 2.3.3,并且我在使用从json网页获取的二维数组时遇到问题。当2D阵列的第3列中存在空值时,会发生特定问题。
以下是grails中工作流程的概述:
首先呈现json对象:
render ( ['P' : jsonObject.picId, 'A' : jsonObject.audioId, 'C' : jsonObject.caption, 'V' : jsonObject.vidTemplateId ] as JSON)
然后将其重新转换为2D数组以传入storeVideoSlotData服务:
def vidpNmList = [][]
vidpNmList[0] = jsonObject.picId
vidpNmList[1] = jsonObject.audioId
vidpNmList[2] = jsonObject.caption
然后调用通过vidpNmList的服务:
def vsaInst = vdSlotService.storeVideoSlotData( vidpNmList, session)
在服务中,它会再次重新组合成三个独立的组件:
def picId = vidpNmList[0]
def audioId = vidpNmList[1]
def caption = vidpNmList[2]
以下列出了两种形式的数据:
vidpNmList:[[331,332,334,null,null,null,null,null,null,null,null,null],[null,null,null,null,null,null,null,null,null ,null,null,null],[null,输入标题数据,输入标题数据,null,null,null,null,null,null,null,null]]
picId:[331,332,334,null,null,null,null,null,null,null,null,null]
audioId:[null,null,null,null,null,null,null,null,null,null,null,null]
标题:[null,输入标题数据,输入标题数据,null,null,null,null,null,null,null,null]
在此服务中,对此标题列中包含空值的特定值的任何引用都会导致错误:
当标题[currSlotNo]为空值时,此行会导致错误:
if(!(caption[currSlotNo]) ) {
log.debug(" caption is null and cannot be displayed. ")
}
错误是:
homevu1.VdSlotService updVideoSlotData pictureInst:331 picId [currSlotNo]:331 homevu1.VdSlotService updVideoSlotData picMK:331
homevu1.VdSlotService updVideoSlotData audMK:null
errors.GrailsExceptionResolver处理请求时发生JSONException:[POST] / HomeVu1 / videoShr / getJsVidCoords
未找到JSONArray [0] .. Stacktrace如下: org.codehaus.groovy.grails.web.json.JSONException:找不到JSONArray [0]。
如果我在vidpNmList数组中引用元素的值,则会发生同样的错误。
我做错了什么或者可能有一些解决方法?
这是我通过“尝试/捕获”引入的解决方法。构建whcih离开'captionVal'为null:
def captionVal = null
try{ captionVal = caption[currSlotNo]
log.debug(" ${functionName} caption value assigned correctly ")
}
catch (Exception eWrite)
{
// fails - can only trap and work around the error atm.
log.debug(" ${functionName} caption value fails to assign correctly - remains at null default - Error Message: $eWrite")
}
显示从" null"重置json对象标题元素的代码在将其分配给vidpNmList之前将字符串转换为实际的null:
for (def iC = 0; iC < jsonObject.caption.size() ; iC++)
{
String currCap = jsonObject.caption[iC]
if( currCap == "null")
{
log.debug(" getJsVisCoords null value iC: $iC " + " caption[iC]: " + jsonObject.caption[iC] + " currCap Length: " + currCap.length())
jsonObject.caption[iC] = null
}
else
{
log.debug(" getJsVisCoords Non null value iC: $iC " + " caption[iC]: " + jsonObject.caption[iC] + " currCap Length: " + currCap.length())
}
}
vidpNmList[2] = jsonObject.caption
-Mike
答案 0 :(得分:0)
不确定JSON参与此方案的位置,但查看上面的代码,您还有其他选择:
最多可以将这些列表收集到标题audioId picId
def picId = vidpNmList[0]
def audioId = vidpNmList[1]
def caption = vidpNmList[2]
您显示输出已关闭:
def picId=[331, 332, 334, null, null, null, null, null, null, null, null, null]
def audioId=[null, null, null, null, null, null, null, null, null, null, null, null]
def Captions=[null, 333, 333, null, null, null, null, null, null, null, null]
现在我正在玩这个清单:
/ you are current failing on this
def pic=picId[0]
//instead of above element[id] try .get(id)
def cap=Captions.get(2)
println "--- ${pic} @@@ ${cap}"
//Then you can test by saying
if (cap&&something&&somethingEls) {
doSomething
}
我回来了
--- 331 @@@ 333
无论如何要找到更多上面的列表如果这是你要回到这些对象中看看这里看看这里:http://mrhaki.blogspot.co.uk/2009/10/groovy-goodness-finding-data-in.html
编辑添加关于for循环:
for (def iC = 0; iC < jsonObject.caption.size() ; iC++)
通常在groovy中,for循环应该表示如下:
int iC=0
for (iC < jsonObject.caption.size() ; iC++) {
无论如何都试试这个:
jsonObject?.caption?.eachWithIndex{ item, i ->
if (JSONObject.NULL.equals(item) {
item=null
}
}
vidpNmList[2] = jsonObject.caption
如果失败,您可以尝试将其迭代到新列表,尽管我怀疑它确实是必需的:
def finalList=[]
jsonObject?.caption?.eachWithIndex{ item, i ->
if (JSONObject.NULL.equals(item) {
item=null
}
finalList << item
}
vidpNmList[2] = finalList
比你的for循环版本更短更易于遵循:)我添加了withIndex和i,在你的情况下如果是item [i]但是没有必要,因为你已经遍历每个元素所以你甚至可以剪切它进一步:
jsonObject?.caption?.each{ item ->
if (JSONObject.NULL.equals(item) {
item=null
}
}
vidpNmList[2] = jsonObject.caption
你可能需要在上面的所有例子中调整这个if (JSONObject.NULL.equals(item) {
,因为考虑到它,这不再是json所以这样:
if (!item ||(item && item=='null')) {
item=null
}