使用JSONObject.getString()时报错:Cannot resolve method ‘getString‘ in ‘JSONObject‘,详解JSONObject三种库的用法

目录

[使用JSONObject.getString()时报错:Cannot resolve method 'getString' in 'JSONObject',JSONObject三种库的用法](#使用JSONObject.getString()时报错:Cannot resolve method 'getString' in 'JSONObject',JSONObject三种库的用法)

一、背景描述

二、问题解决

1、使用org.json.JSONObject读取属性

2、使用org.json.simple.JSONObject读取属性

3、使用cn.hutool.json.JSONObject读取属性

三、三个JSONObject库之间的相同与不同

1、相同点

2、不同点

①方法命名

②依赖体积

③使用便捷性

④扩展性

四、总结


作者:watermelo37

涉及领域:Vue、SpingBoot、Docker、LLM、python等


温柔地对待温柔的人,包容的三观就是最大的温柔。


使用JSONObject.getString()时报错:Cannot resolve method 'getString' in 'JSONObject',JSONObject三种库的用法

一、背景描述

前几天我在修改后端的JSON数据处理的时候,用了一个很常见的语法:

即:JSONObject.getString(xxx)

JSONObject.getString(xxx) 是一个方法调用,它属于 org.json 包中的 JSONObject 类。这个方法用于从 JSONObject 实例中提取与给定键(xxx)相关联的字符串值。JSONObject 是一个用于表示 JSON 对象的类,它允许你以键值对的形式存储和检索数据。

但是它却报错了:

Cannot resolve method 'getString' in 'JSONObject'。

JSONObject对象里面怎么可能没有getString方法呢?我想了一下Java8有很多语法用不了,可能是Java版本落后的问题,可查了一下Java8也是支持JSONObject.getString(xxx)方法的,这就很奇怪了。

平时后端开发做得少,实在是不理解这种报错,相当于告诉我vue里面没有双向数据绑定一样,摸不着头脑。

二、问题解决

最后原因其实很简单,JSONObject与JSONObject是不一样的。事实上JSONObject至少有三种类型:

  • org.json.JSONObject
  • org.json.simple.JSONObject
  • cn.hutool.json.JSONObject

其中只有org.json.JSONObject可以用JSONObject.getString(xxx)这个语法,别的都是不行的。

1、使用org.json.JSONObject读取属性

正确代码实例:

java 复制代码
import org.json.JSONObject;

public class Test {
    public static void main(String[] args) {
        String jsonString = "{ \"data\": { \"post\": \"8080\", \"host\": \"127.0.0.1\" } }";
        JSONObject modelInfo = new JSONObject(jsonString);
        JSONObject data = modelInfo.getJSONObject("data");
        String post = data.getString("post");
        String host = data.getString("host");

        System.out.println("Post: " + post);
        System.out.println("Host: " + host);
    }
}

2、使用org.json.simple.JSONObject读取属性

org.json.simple.JSONObject 不支持 getString(xxx) 方法,需要用 get() 方法并手动进行类型转换。

java 复制代码
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;

public class Test {
    public static void main(String[] args) {
        String jsonString = "{ \"data\": { \"post\": \"8080\", \"host\": \"127.0.0.1\" } }";
        JSONParser parser = new JSONParser();
        try {
            JSONObject modelInfo = (JSONObject) parser.parse(jsonString);
            JSONObject data = (JSONObject) modelInfo.get("data");
            String post = (String) data.get("post");
            String host = (String) data.get("host");

            System.out.println("Post: " + post);
            System.out.println("Host: " + host);
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
}

3、使用cn.hutool.json.JSONObject读取属性

cn.hutool.json.JSONObject 使用的是 Hutool 工具包的实现,需要调用 getStr() 方法。

java 复制代码
import cn.hutool.json.JSONObject;

public class Test {
    public static void main(String[] args) {
        String jsonString = "{ \"data\": { \"post\": \"8080\", \"host\": \"127.0.0.1\" } }";
        JSONObject modelInfo = new JSONObject(jsonString);
        JSONObject data = modelInfo.getJSONObject("data");
        String post = data.getStr("post");
        String host = data.getStr("host");

        System.out.println("Post: " + post);
        System.out.println("Host: " + host);
    }
}

可以发现,这三种库虽然都可以使用 JSONObject 对象,但那是三个库调取数据的方法各不相同,相比之下js是真的香,管你什么对象,统一用"."调取属性数据。不明白控制数据类型为什么要控制对象属性的读取方法,有知道的大佬可以在评论区说一下,后端开发不是我的专长,我就不自作聪明了。

三、三个JSONObject库之间的相同与不同

1、相同点

  1. 三种库都提供了 JSONObject 类来解析和操作 JSON 数据。
  2. 它们都以键值对的形式存储 JSON 数据,支持嵌套对象和数组的解析。
  3. 适用于解析 JSON 字符串、构建 JSON 对象、序列化和反序列化。

2、不同点

①方法命名

org.json.JSONObject 使用 getString() 等专门方法访问数据。org.json.simple.JSONObject 使用通用的 get() 方法,需要手动进行类型转换。cn.hutool.json.JSONObject 使用更灵活的 getStr()、getInt() 等方法。

②依赖体积

org.json 是一个轻量级库,适合简单场景。org.json.simple 同样轻量,但功能较少。cn.hutool.json 是 Hutool 工具包的一部分,提供了更多功能,但依赖体积较大。

③使用便捷性

org.json.JSONObject 和 cn.hutool.json.JSONObject 更易用,方法设计贴近实际开发需求。org.json.simple.JSONObject 的 API 显得较为笨拙。

④扩展性

cn.hutool.json.JSONObject 提供了丰富的工具方法,支持链式调用和更多的类型支持。

四、总结

通过以上对比可以发现,虽然这三种库都可以操作 JSON 数据,但它们的功能设计和使用场景各不相同:

  • org.json.JSONObject 适合基础场景,方法直观易懂。
  • org.json.simple.JSONObject 功能最简单,需要更多手动操作。
  • cn.hutool.json.JSONObject 适合复杂项目,提供了更强的扩展能力。

只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~

其他热门文章,请关注:

极致的灵活度满足工程美学:用Vue Flow绘制一个完美流程图

你真的会使用Vue3的onMounted钩子函数吗?Vue3中onMounted的用法详解

通过array.filter()实现数组的数据筛选、数据清洗和链式调用

通过Array.sort() 实现多字段排序、排序稳定性、随机排序洗牌算法、优化排序性能

通过MongoDB Atlas 实现语义搜索与 RAG------迈向AI的搜索机制

TreeSize:免费的磁盘清理与管理神器,解决C盘爆满的燃眉之急

el-table实现动态数据的实时排序,一篇文章讲清楚elementui的表格排序功能

深入理解 JavaScript 中的 Array.find() 方法:原理、性能优势与实用案例详解

MutationObserver详解+案例------深入理解 JavaScript 中的 MutationObserver

Dockerfile全面指南:从基础到进阶,掌握容器化构建的核心工具

在线编程实现!如何在Java后端通过DockerClient操作Docker生成python环境

干货含源码!如何用Java后端操作Docker(命令行篇)

相关推荐
莫克6 分钟前
java文件上传
后端
LeonMinkus7 分钟前
dubbo3使用grpc开发分布式服务
后端
程序喵大人8 分钟前
写C++十年,我现在怎么设计类和模块?(附真实项目结构)
开发语言·c++·类和模板
黄焖鸡能干四碗26 分钟前
信息系统安全保护措施文件方案
大数据·开发语言·人工智能·web安全·制造
一只韩非子32 分钟前
Spring AI Alibaba 快速上手教程:10 分钟接入大模型
java·后端·ai编程
叫我阿柒啊34 分钟前
从Java全栈到云原生:一场技术深度对话
java·spring boot·docker·微服务·typescript·消息队列·vue3
ONLYOFFICE43 分钟前
【技术教程】如何将文档编辑器集成至基于Java的Web应用程序
java·编辑器·onlyoffice
lbwxxc1 小时前
手写 Tomcat
java·tomcat
liulilittle1 小时前
Unix/Linux 平台通过 IP 地址获取接口名的 C++ 实现
linux·开发语言·c++·tcp/ip·unix·编程语言
起风了___1 小时前
20 分钟搞定:Jenkins + Docker 一键流水线,自动构建镜像并部署到远程服务器
后端