Json对象的无限递归问题(使用Java / Javascript)

时间:2015-07-09 21:16:47

标签: javascript java json mirth

我正在使用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";

然后它没有任何问题。

提前感谢您看一下!!

2 个答案:

答案 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"

的公共实例字段或方法

谷歌搜索引导我访问上面链接的博客文章。