当前位置: 首页 > 知识库问答 >
问题:

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

公良飞尘
2023-03-14

我用Json创建了一个数据库。我解析了这个数据库,并让代码遍历一个包含几个Json对象的Json数组。最后,我也在遍历Json对象中的值。我的问题是我需要检查迭代器所在的值是字符串还是数组。

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

所以,这些问题似乎对我想要的东西没有多大帮助。有一个案例与我的非常相似,但它处理的是原始数据类型,所以我处理字符串的案例不起作用。(这里是另一个案例的链接:Java如何检查字符串值是否是给定类的类型

这是我的数据库的一小部分:配置阵列随着数据库的深入而变长。我不能简单地将值保存在字符串中,因为“上标”需要格式化为“术语”上的上标。我计划稍后再这样做,但无论如何,我都需要让程序弄清楚它是处理字符串还是数组。

{
"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();
}
}

elementKeys.next()获取值的名称。例如名称、符号、nobleGasConfiguration。对于实际值(如名称中的氢),我一直使用. getString()方法将其作为字符串获取。但是,这会导致程序在尝试获取数组时崩溃,因为. getString()用于获取字符串...不是数组。

我的主要问题是获取要检查的正确值。我当前的if语句总是显示为true。这是因为. Next()获取的值确实是字符串,因此instanceof返回true。即使是数组名也是如此。然后程序进入if语句,当. getString()尝试获取数组时崩溃。

if(elementKeys.next() instanceof java.lang.String)

那么,我的问题。如何安全地获得正确的值(如“name”:“Hydrogen”中的“Hydrogen”)以供if语句检查?(如果我需要使用完全不同的方法来检查值类型,这无关紧要,最终我需要一种方法来检查值类型)

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

便条簿

命令提示符

Java8

javax.json-1.0.jar

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

共有1个答案

李跃
2023-03-14

我修改了您的类,以递归方式处理嵌套的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或两者之间的区别,因此,这向您展示了如何检测这两种情况,因此您可以非常具体。 我也在这里发布了交互式代码示例:http : //play.golang.org/p/VmT0BVBJZ7 将输出以下内容

  • 问题内容: 我的服务器端代码返回一个值,该值成功时为json对象,失败时为字符串’false’。现在如何检查返回的值是否为json对象? 问题答案: 如果字符串是JSON,则jQuery.parseJSON()应该返回类型为“对象”的对象,因此您只需使用以下命令检查类型

  • 问题内容: 如何检查给定的字符串是否采用以空格/换行符分隔的多个json字符串形式? 例如, 给定的:(3个json与空格连接) return :,因为item( 和)中的每个都是有效的json。 在Go中,我可以编写一个O(N ^ 2)函数,例如: 但这不适用于大量输入。 问题答案: 有两种选择。从编码的角度来看,最简单的方法就是正常解码JSON字符串。您可以通过解码为空结构来提高效率: (游乐

  • 问题内容: 在解析字符串之前,如何检查字符串是否为数字? java 字符串 数字 问题答案: 使用及更高版本:或。 使用Apache Commons Lang 3.4及以下版本:或。 你还可以使用返回true空字符串,并忽略字符串中的内部空格。另一种方法是使用根据Java基本检查数字是否可解析的方法。(链接的javadocs包含每种方法的详细示例。)

  • 在解析字符串之前,如何检查字符串是否为数字?

  • 问题内容: 如何在Java中检查字符串是否为数字? 问题答案: 使用Apache Commons Lang 3.5及更高版本:NumberUtils.isCreatable或StringUtils.isNumeric。 使用Apache Commons Lang 3.4及以下版本:NumberUtils.isNumber或StringUtils.isNumeric。 你还可以使用StringUti