使用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(命令行篇)

相关推荐
虾球xz1 分钟前
CppCon 2015 学习:3D Face Tracking and Reconstruction using Modern C++
开发语言·c++·学习·3d
林鸿群4 分钟前
C#子线程更新主线程UI及委托回调使用示例
开发语言·c#
程序员岳焱9 分钟前
Java 与 MySQL 性能优化:MySQL 慢 SQL 诊断与分析方法详解
后端·sql·mysql
爱编程的喵9 分钟前
深入理解JavaScript原型机制:从Java到JS的面向对象编程之路
java·前端·javascript
龚思凯15 分钟前
Node.js 模块导入语法变革全解析
后端·node.js
天行健的回响17 分钟前
枚举在实际开发中的使用小Tips
后端
on the way 12320 分钟前
行为型设计模式之Mediator(中介者)
java·设计模式·中介者模式
保持学习ing22 分钟前
Spring注解开发
java·深度学习·spring·框架
wuhunyu23 分钟前
基于 langchain4j 的简易 RAG
后端
techzhi23 分钟前
SeaweedFS S3 Spring Boot Starter
java·spring boot·后端