我正在使用Javascript / Java查询MSSQL数据库,然后使用从查询接收的CachedRowSet将一些信息添加到Json对象。这是查询数据库并将结果添加到对象的代码。
var sqlGetVariables = "SELECT MappingVariable.Id as Id, MappingVariable.Name AS Name, MappingVariable.Value AS Value FROM MappingGroup LEFT JOIN MappingVariable ON MappingGroup.Id = MappingVariable.MappingGroupId WHERE MappingGroup.Id = " + mappingGroupId + " AND MappingVariable.Id IS NOT NULL";
var resultVariables = uberfaceDB.executeCachedQuery(sqlGetVariables);
while (resultVariables.next()) {
var variableId = resultVariables.getObject("Id");
var variableName = resultVariables.getObject("Name");
var variableMapping = resultVariables.getObject("Value");
jsonArray["Segments"][seg]["Variables"][variableName] = {};
jsonArray["Segments"][seg]["Variables"][variableName]["Mapping"] = variableMapping;
}
我遇到的问题是,最后一行有一些愚蠢的事情,我将“variableMapping”分配给Json对象。代码行执行得很好,但是当我稍后重复遍历Json对象时,我陷入了无限递归,它继续循环“class”“package”和“specificationversion”。
这是我用来迭代对象的代码。
function echoJson (jsonArray, strStuff) {
var strJson = "" + strStuff;
for (var item in jsonArray) {
logger.error(strJson + " --> " + item);
echoJson(jsonArray[item], strJson + " --> " + item);
}
}
logger.error函数内置于我正在编码的应用程序(称为Mirth Connect)中。它只是将消息输出到控制台以进行错误/调试。以下是使用echoJson函数获取EXPECT的示例:
细分 - > MSH - >细分 - > PID - >变量 - > PatientFirstName - >映射 - > variableMappingValue
但这是我实际得到的:
细分 - > MSH - >细分 - > PID - >变量 - > PatientFirstName - >映射 - > class - >包 - > specificationVersion - > class - >包 - > specificationVersion - > class - >包 - > specificationVersion ...
它会继续无限地重复“class - > package - > specificationVersion”部分,直到我停止应用程序。
如果我替换以下代码行:
jsonArray["Segments"][seg]["Variables"][variableName]["Mapping"] = variableMapping;
使用硬编码字符串,例如
jsonArray["Segments"][seg]["Variables"][variableName]["Mapping"] = "test";
然后它没有任何问题。
提前感谢您看一下!!
答案 0 :(得分:0)
你的函数echoJson正在调用自己。这称为递归。从here,"递归调用函数的第一件事是你需要确保存在某种形式的退出条件,其中函数不会递归地调用它自己。"您的函数似乎没有退出条件。换句话说,在echoJson中调用echoJson之前,首先检查是否应该。
function echoJson (jsonArray, strStuff) {
var strJson = "" + strStuff;
for (var item in jsonArray) {
logger.error(strJson + " --> " + item);
if (isGoodAndNice(jsonArray[item]))
echoJson(jsonArray[item], strJson + " --> " + item);
}
}
答案 1 :(得分:0)
我找到了解决方案,如another programmer's blog所述。
数据类型存在于CachedRowSet中存在问题。我不知道确切的数据类型,但是从我收集到的" variableMapping"变量是一个字节数组,我需要将它作为字符串添加到我的Json对象中。我必须做"新的String(variableMapping)"将数组转换为字符串,这解决了我的问题。
我是如何发现问题的:我决定尝试使用JSON.stringify()输出我的Json对象,并收到以下错误:
Java class" [B"没有名为" toJSON"
的公共实例字段或方法
谷歌搜索引导我访问上面链接的博客文章。