java - javax.json - 如何检查一个值是否为字符串
java - javax.json - How to check if a value is a string
我有一个在 Json 中创建的数据库。我对此进行了解析,并让代码遍历 Json 数组,该数组包含多个 Json 对象。最后,我还遍历了 Json 对象中的值。我的问题是我需要检查迭代器所在的值是字符串还是数组。
Google 似乎只有检查字符串中是否有数字或该问题的其他变体之类的事情。
SO 问题似乎并没有满足我的要求。有一个案例与我的非常相似,但是它处理的是原始数据类型,所以我处理字符串的案例不起作用。 (这是另一种情况的 link:Java how to check if a string value is a type of given Class<?> )
这是我的数据库的一小部分:随着您深入数据库,配置数组会变长。我不能简单地将值保存在字符串中,因为 "superscript" 需要格式化为 "term" 上的上标。我计划稍后执行此操作,但无论哪种方式,我都需要让程序弄清楚它是在处理字符串还是数组。
{
"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"
}
]
}
}
这是我的代码: post 判断它是处理字符串还是数组的代码部分位于 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() 获取值的名称。例如 "name"、"symbol"、"nobleGasConfiguration"。对于实际值(例如 "name" 中的 "Hydrogen" : "Hydrogen"),我一直使用 .getString() 方法将其作为字符串获取。但是,这会导致程序在尝试获取数组时崩溃,因为 .getString() 用于获取字符串...而不是数组。
我的主要问题是获取要检查的正确值。我当前的 if 语句始终为真。这是因为 .next() 得到的值确实是字符串,因此 instanceof returns 为真。即使对于数组名称也是如此。然后程序进入 if 语句并在 .getString() 尝试获取数组时崩溃。
if(elementKeys.next() instanceof java.lang.String)
所以,我的问题。我如何安全地获取正确的值(例如 "Hydrogen" from "name" : "Hydrogen")来检查我的 if 语句? (如果我需要使用完全不同的方法来检查值类型并不重要,最终我需要一种方法来检查值类型)
我在使用什么programs/versions?
记事本
命令提示符
Java 8
javax.json-1.0.jar
请保留 java 和 javax.json 的答案。
我修改了您的 class 以递归处理嵌套的 JsonArray 类型元素,有效地展平了属性。您应该能够对此代码稍作修改,以此作为完成您希望的事情的基础。祝你好运。
import javax.json.*;
import java.io.FileReader;
import java.util.List;
import java.util.Set;
public class DataTest {
public void processJson(String path) {
JsonReader reader = null;
try {
reader = Json.createReader(new FileReader(path));
JsonObject jsonObj = reader.readObject();
processJsonObject(jsonObj);
} catch (Exception ioe) {
ioe.printStackTrace();
} finally {
if (reader != null) {
reader.close();
}
}
}
private void processJsonObject(JsonObject jsonObj) {
Set<String> keys = jsonObj.keySet();
for (String key : keys) {
JsonValue value = jsonObj.get(key);
processJsonObject(key, value);
}
}
private void processJsonObject(String key, JsonValue value){
switch(value.getValueType()){
case ARRAY:
processJsonObject(key, (JsonArray)value);
break;
default:
processJsonObject(key, (JsonString)value);
}
}
private void processJsonObject(String key, JsonArray array) {
System.out.println("Array: key[" + key + "] = " + "An Array: " + array);
List<JsonObject> elements = array.getValuesAs(JsonObject.class);
for(JsonObject element: elements) {
processJsonObject(element);
}
}
private void processJsonObject(String key, JsonString value) {
System.out.println("String: key[" + key + "] = " + value);
}
public static void main(String[] args) {
DataTest test = new DataTest();
test.processJson("/Data/Test/src/main/resources/elements.json");
}
}
我有一个在 Json 中创建的数据库。我对此进行了解析,并让代码遍历 Json 数组,该数组包含多个 Json 对象。最后,我还遍历了 Json 对象中的值。我的问题是我需要检查迭代器所在的值是字符串还是数组。
Google 似乎只有检查字符串中是否有数字或该问题的其他变体之类的事情。
SO 问题似乎并没有满足我的要求。有一个案例与我的非常相似,但是它处理的是原始数据类型,所以我处理字符串的案例不起作用。 (这是另一种情况的 link:Java how to check if a string value is a type of given Class<?> )
这是我的数据库的一小部分:随着您深入数据库,配置数组会变长。我不能简单地将值保存在字符串中,因为 "superscript" 需要格式化为 "term" 上的上标。我计划稍后执行此操作,但无论哪种方式,我都需要让程序弄清楚它是在处理字符串还是数组。
{
"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"
}
]
}
}
这是我的代码: post 判断它是处理字符串还是数组的代码部分位于 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() 获取值的名称。例如 "name"、"symbol"、"nobleGasConfiguration"。对于实际值(例如 "name" 中的 "Hydrogen" : "Hydrogen"),我一直使用 .getString() 方法将其作为字符串获取。但是,这会导致程序在尝试获取数组时崩溃,因为 .getString() 用于获取字符串...而不是数组。
我的主要问题是获取要检查的正确值。我当前的 if 语句始终为真。这是因为 .next() 得到的值确实是字符串,因此 instanceof returns 为真。即使对于数组名称也是如此。然后程序进入 if 语句并在 .getString() 尝试获取数组时崩溃。
if(elementKeys.next() instanceof java.lang.String)
所以,我的问题。我如何安全地获取正确的值(例如 "Hydrogen" from "name" : "Hydrogen")来检查我的 if 语句? (如果我需要使用完全不同的方法来检查值类型并不重要,最终我需要一种方法来检查值类型)
我在使用什么programs/versions?
记事本
命令提示符
Java 8
javax.json-1.0.jar
请保留 java 和 javax.json 的答案。
我修改了您的 class 以递归处理嵌套的 JsonArray 类型元素,有效地展平了属性。您应该能够对此代码稍作修改,以此作为完成您希望的事情的基础。祝你好运。
import javax.json.*;
import java.io.FileReader;
import java.util.List;
import java.util.Set;
public class DataTest {
public void processJson(String path) {
JsonReader reader = null;
try {
reader = Json.createReader(new FileReader(path));
JsonObject jsonObj = reader.readObject();
processJsonObject(jsonObj);
} catch (Exception ioe) {
ioe.printStackTrace();
} finally {
if (reader != null) {
reader.close();
}
}
}
private void processJsonObject(JsonObject jsonObj) {
Set<String> keys = jsonObj.keySet();
for (String key : keys) {
JsonValue value = jsonObj.get(key);
processJsonObject(key, value);
}
}
private void processJsonObject(String key, JsonValue value){
switch(value.getValueType()){
case ARRAY:
processJsonObject(key, (JsonArray)value);
break;
default:
processJsonObject(key, (JsonString)value);
}
}
private void processJsonObject(String key, JsonArray array) {
System.out.println("Array: key[" + key + "] = " + "An Array: " + array);
List<JsonObject> elements = array.getValuesAs(JsonObject.class);
for(JsonObject element: elements) {
processJsonObject(element);
}
}
private void processJsonObject(String key, JsonString value) {
System.out.println("String: key[" + key + "] = " + value);
}
public static void main(String[] args) {
DataTest test = new DataTest();
test.processJson("/Data/Test/src/main/resources/elements.json");
}
}