Json 对象的无限递归问题(使用 Java/Javascript)
Infinite recursion issue with Json object (using Java/Javascript)
我正在使用 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)中。它只是出于 error/debugging 目的将消息输出到控制台。这是我希望通过 echoJson 函数获得的示例:
Segments --> MSH --> Segments --> PID --> Variables --> PatientFirstName --> Mapping --> variableMappingValue
但这是我实际得到的:
Segments --> MSH --> Segments --> PID --> Variables --> PatientFirstName --> Mapping --> class --> package --> specificationVersion --> class --> package --> specificationVersion --> class --> package --> specificationVersion...
它继续无限重复 "class --> package --> specificationVersion" 部分,直到我停止应用程序。
如果我替换下面这行代码:
jsonArray["Segments"][seg]["Variables"][variableName]["Mapping"] = variableMapping;
使用硬编码字符串,例如
jsonArray["Segments"][seg]["Variables"][variableName]["Mapping"] = "test";
然后就可以正常工作了。
提前感谢您查看此内容!!
您的函数 echoJson 正在调用自身。这称为递归。从 here, "the first thing when calling a function recursively is that you need to make sure that there is some form of exit condition where the function will not call itself recursively." 看来你的函数没有退出条件。换句话说,在 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);
}
}
我找到了解决方案,如 another programmer's blog 所述。
CachedRowSet 中存储的数据类型存在问题。我不知道确切的数据类型,但根据我收集到的信息,"variableMapping" 变量是一个字节数组,我需要将它作为字符串添加到我的 Json 对象中。我不得不 "new String(variableMapping)" 将数组转换为字符串,这解决了我的问题。
我是如何发现问题的:我决定尝试使用 JSON.stringify() 来输出我的 Json 对象,但收到以下错误:
Java class "[B" has no public instance field or method named "toJSON"
通过谷歌搜索将我带到博客 post 我链接到上面。
我正在使用 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)中。它只是出于 error/debugging 目的将消息输出到控制台。这是我希望通过 echoJson 函数获得的示例:
Segments --> MSH --> Segments --> PID --> Variables --> PatientFirstName --> Mapping --> variableMappingValue
但这是我实际得到的:
Segments --> MSH --> Segments --> PID --> Variables --> PatientFirstName --> Mapping --> class --> package --> specificationVersion --> class --> package --> specificationVersion --> class --> package --> specificationVersion...
它继续无限重复 "class --> package --> specificationVersion" 部分,直到我停止应用程序。
如果我替换下面这行代码:
jsonArray["Segments"][seg]["Variables"][variableName]["Mapping"] = variableMapping;
使用硬编码字符串,例如
jsonArray["Segments"][seg]["Variables"][variableName]["Mapping"] = "test";
然后就可以正常工作了。
提前感谢您查看此内容!!
您的函数 echoJson 正在调用自身。这称为递归。从 here, "the first thing when calling a function recursively is that you need to make sure that there is some form of exit condition where the function will not call itself recursively." 看来你的函数没有退出条件。换句话说,在 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);
}
}
我找到了解决方案,如 another programmer's blog 所述。
CachedRowSet 中存储的数据类型存在问题。我不知道确切的数据类型,但根据我收集到的信息,"variableMapping" 变量是一个字节数组,我需要将它作为字符串添加到我的 Json 对象中。我不得不 "new String(variableMapping)" 将数组转换为字符串,这解决了我的问题。
我是如何发现问题的:我决定尝试使用 JSON.stringify() 来输出我的 Json 对象,但收到以下错误:
Java class "[B" has no public instance field or method named "toJSON"
通过谷歌搜索将我带到博客 post 我链接到上面。