【发布时间】:2016-03-18 15:37:55
【问题描述】:
我有一个用 Json 创建的数据库。我对此进行了解析,并让代码遍历了一个包含多个 Json 对象的 Json 数组。最后,我还在遍历 Json 对象中的值。我的问题是我需要检查迭代器所在的值是字符串还是数组。
Google 似乎只有检查字符串中是否有数字或该问题的其他变体之类的功能。
SO 问题似乎对我想要的东西并不多。有一个案例与我的非常相似,但是它处理的是原始数据类型,所以我处理字符串的案例不起作用。 (这是另一个案例的链接:Java how to check if a string value is a type of given Class<?>)
这是我的数据库的一小部分:随着您深入数据库,配置数组会变得更长。我不能简单地将值保存在字符串中,因为“上标”需要格式化为“术语”上的上标。我打算稍后再做,但无论哪种方式,我都需要让程序弄清楚它是在处理字符串还是数组。
{
"Elements" : [
{
"name" : "Hydrogen",
"Symbol" : "H",
"atomicNumber" : "1",
"electronegativity" : "2.2",
"group" : "Hydrogen",
"ionCharge1" : "1+",
"ionCharge2" : "1-",
"molarMass" : "1.01",
"naturalState" : "Gas",
"synthetic" : "false",
"diatomic" : "true",
"columnNumber" : "1",
"row" : "1",
"columnCode" : "IA",
"nobleGasConfiguration" : [
{
"term:" : "No Noble Gas Configuration",
"superScript" : "-"
}
],
"electronConfiguration" : [
{
"term" : "1s",
"superScript" : "1"
}
]
}
}
这是我的代码:用于确定是处理字符串还是数组的代码部分位于 if 语句(只有 1 个 if 语句)
import javax.json.Json;
import javax.json.JsonReader;
import javax.json.JsonStructure;
import javax.json.JsonObject;
import javax.json.JsonArray;
import javax.json.JsonValue;
import java.util.Iterator;
import java.util.Collection;
import java.io.FileReader;
import java.io.IOException;
import java.lang.String;
public class DataTest
{
public static void main(String[]args) throws IOException
{
String strValue = "";
JsonReader reader = Json.createReader(new FileReader("Elements.JSON"));
JsonObject jsonst = reader.readObject();
JsonArray elements = jsonst.getJsonArray("Elements");
for (int i = 0; i < elements.size(); i++)
{
JsonObject element = elements.getJsonObject(i);
Collection<String> elementValues = element.keySet();
Iterator<String> elementKeys = elementValues.iterator();
while(elementKeys.hasNext())
{
if(elementKeys.next() instanceof java.lang.String)
{
System.out.println(elementKeys.next());
String elementKey = elementKeys.next();
strValue = element.getString(elementKey);
System.out.println(strValue);
}
}
}
reader.close();
}
}
我想我的 if 语句已经快完成了,但我又陷入了原来的问题。 elementKeys.next() 获取值的名称。例如“名称”、“符号”、“nobleGasConfiguration”。对于实际值(例如“name”中的“Hydrogen”:“Hydrogen”),我一直使用 .getString() 方法将其作为字符串获取。但是,这会导致程序在尝试获取数组时崩溃,因为 .getString() 用于获取字符串...不是数组。
我的主要问题是要检查正确的值。我当前的 if 语句总是正确的。这是因为 .next() 获取的值确实是字符串,因此 instanceof 返回 true。即使是数组名称也是如此。然后程序进入 if 语句并在 .getString() 尝试获取数组时崩溃。
if(elementKeys.next() instanceof java.lang.String)
所以,我的问题。如何安全地获得正确的值(例如“名称”中的“氢”:“氢”)以供我的 if 语句检查? (如果我需要使用完全不同的方法来检查值类型也没关系,最终我需要一种方法来检查值类型)
我使用的是什么程序/版本?
记事本
命令提示符
Java 8
javax.json-1.0.jar
请保留 java 和 javax.json 的答案。
【问题讨论】:
-
通常在处理 JSON 时,尤其是在处理自己的数据或数据库中的数据时,您知道预期的结构。您为什么要尝试处理此问题,因为您事先不知道 JSON 结构会是什么样子。我的意思是,你知道 nobleGasConfiguration 和 electronConfiguration 是数组类型,不是吗?此外,您不想将诸如摩尔质量之类的数字值作为 int 处理吗?
-
没有数值,这些值是用来显示的。一些包含数字的字符串将有其他用途,需要获取数字,但过程是它作为字符串开始,被传递到类的实例中(这还没有编码,所以我现在只是打印出值)然后使用该信息。
-
至于不知道这些值,我知道 2 个可能的值 - 字符串和数组。但是我需要程序检查该值是字符串还是数组,因此它不会尝试使用 getString() 来获取数组。这将导致崩溃。我可以为每个值设置一个字符串,但是稍后我会将 13 个值传递给一个类的实例。让程序一个一个地遍历每个值并将它们传递给实例会更有效率。
-
那么,如果你有一个数组,现在你想做什么?循环遍历数组并打印数组的每个元素?
-
现在我想获取信息的值类型(“名称”:“氢”,“氢”的值类型是什么?)是否在 if 语句之前完成,或者if 语句中的条件无关紧要。我的主要问题是我有 elementKeys.next(),这将给出“名称”(来自上面的示例),但是我将如何获得“Hydrogen”(我可以在其中获得数组或字符串)?
标签: java json command-prompt notepad