繁体   English   中英

java - javax.json - 如何检查值是否为字符串

[英]java - javax.json - How to check if a value is a string

我有一个用 Json 制作的数据库。 我对此进行了解析,并让代码遍历一个包含多个 Json 对象的 Json 数组。 最后,我还遍历 Json 对象中的值。 我的问题是我需要检查迭代器所在的值是字符串还是数组。

谷歌似乎只有检查字符串中是否有数字或该问题的其他变体之类的东西。

所以问题似乎对我想要的东西没有多少。 有一个案例与我的非常相似,但是它处理的是原始数据类型,所以我处理字符串的案例不起作用。 (这是另一个案例的链接: 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 语句检查正确的值(例如“名称”中的“氢”:“氢”)? (如果我需要使用完全不同的方法来检查值类型并不重要,最终我需要一种检查值类型的方法)

我使用的是什么程序/版本?

记事本

命令提示符

爪哇 8

javax.json-1.0.jar

请保留 java 和 javax.json 的答案。

我已经修改了您的类以递归处理嵌套的 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");
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM