jjzjj

JSONArray与JSONObject

364.99° 2024-03-04 原文

目录

1. 需求

最近有个需求: 要接收某个接口的 JSON 数据,而这个JSON数据有可能是一个 JSON 对象,也有可能是一个 JSON数组。

"{'name','王五','age':10}"

"[{'name':'张三','age':12},{'name':'李四','age':11}]"

现在呢,我需要根据传递过来的 JSON 数据进行判断,如果是对象就调用 resolve1(),如果是数组就调用 resolve2()。

依赖:

  • 本文采用 fastjson 来处理 JSON 数据

            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>1.2.83</version>
            </dependency>
    
  • 因为要处理 JSON 数组,所以要使用 JSONArray.parseArray

2. 测试

首先呢,要判断 JSON 数据是否是一个数组,那么我首先想到的是,我用 JSONArray.parseArray 会不会出现异常,如果出现了异常,那我 try-catch 一下,不是很简单就能实现了吗。

测试代码:

/**
 * @author chenjy
 * @description:
 * @date 2023/1/11
 */
public class JSONTest {
    public static void main(String[] args) {
        String jsonArr = "[{'name':'张三','age':12},{'name':'李四','age':11}]";
        String jsonObj = "{'name':'王五','age':10}";
        JSONArray jsonArray = JSONArray.parseArray(jsonArr);
        System.out.println(jsonArray);
        JSONArray jsonObject = JSONArray.parseArray(jsonObj);
        System.out.println(jsonObject);
    }
}

控制台输出:

很显然,JSONArray.parseArray 转换 JSON 对象 的时候会抛出异常 com.alibaba.fastjson.JSONException,那么我们实现需求的思路就变得简单起来了。


兴趣使然,我再来看一下 JSONObject.parseObject 能不能转换 JSON 数组。

测试代码:

/**
 * @author chenjy
 * @description:
 * @date 2023/1/11
 */
public class JSONTest {
    public static void main(String[] args) {
        String jsonArr = "[{'name':'张三','age':12},{'name':'李四','age':11}]";
        String jsonObj = "{'name':'王五','age':10}";
        JSONObject jsonObject = JSONObject.parseObject(jsonObj);
        System.out.println(jsonObject);
        JSONObject jsonArray = JSONObject.parseObject(jsonArr);
        System.out.println(jsonArray);
    }
}

控制台输出:

果然,也会抛出异常 com.alibaba.fastjson.JSONException

3. 实现需求

好的,经过上面的测试,我们的需求实现思路:在 try 中调用 resolve2,在 catch 中调用 resolve1

/**
 * @author chenjy
 * @description:
 * @date 2023/1/11
 */
public class JSONTest {
    public static void main(String[] args) {
        String jsonArr = "[{'name':'张三','age':12},{'name':'李四','age':11}]";
        String jsonObj = "{'name':'王五','age':10}";

        System.out.println("======测试 JSON 数组======");
        getParam(jsonArr);

        System.out.println("======测试 JSON 对象======");
        getParam(jsonObj);
    }

    public static void getParam(String str) {
        try {
            JSONArray jsonArray = JSONArray.parseArray(str);
            resolve2(jsonArray);
        } catch (JSONException e) {
            JSONObject jsonObject = JSONObject.parseObject(str);
            resolve1(jsonObject);
        }
    }

    /*
        处理对象
     */
    public static void resolve1(JSONObject obj) {
        System.out.println("姓名:" + obj.getString("name") + "年龄:" + obj.get("age"));
    }

    /*
        处理数组
     */
    public static void resolve2(JSONArray array) {
        for (Object obj : array) {
            JSONObject jObj = (JSONObject) JSON.toJSON(obj);
            System.out.println("姓名:" + jObj.getString("name") + "年龄:" + jObj.get("age"));
        }
    }
}

4. 相关操作

1. 将JSONObject装入JSONArray

我来形象地说明一下两者的关系

  • JSONObject 就相当于一个 Map,往 JSONObject 中新增键值对的方法: put(key, value),删除键值对的方法:remove(key)
  • JSONArray 相当于一个 List<Map>,往 JSONObject 中新增元素的方法: add(JSONObject),删除键值对的方法:remove(object)

2. JSONArray与String的相互转换

  • StringJSONArrayJSONArray.parseArray(String str)
  • JSONArrayStringjsonArray.toString()jsonArray.toJSONString()String.valueOf(jsonArray)

顺便说一下 JSONObjectString 之间的相互转换

  • StringJSONObjectJSONObject.parseObject(String str)
  • JSONObjectStringjsonObject.toJSONString()jsonObject.toString()String.valueOf(jsonObject)
        String jsonArr = "[{'name':'张三','age':12},{'name':'李四','age':11}]";
        String jsonObj = "{'name':'王五','age':10}";
        JSONArray jsonArray = JSONArray.parseArray(jsonArr);
        System.out.println(
                jsonArray.toJSONString() instanceof String
                && jsonArray.toString() instanceof String
                && String.valueOf(jsonArray) instanceof String
        );
        JSONObject jsonObject = JSONObject.parseObject(jsonObj);
        System.out.println(
                jsonObject.toJSONString() instanceof String
                && jsonObject.toString() instanceof String
                && String.valueOf(jsonObject) instanceof String
        );

3. 注意:toString与JSONObject.toJSONString的区别

public class JSONTest {
    public static void main(String[] args) {
        Tom tom = new Tom("张三", 18);
        System.out.println(tom.toString());
        JSONObject jsonObject = JSONObject.parseObject(JSONObject.toJSONString(tom));
        System.out.println(jsonObject);
        jsonObject.put("sex", 1);
        System.out.println(jsonObject.toJSONString());
    }
}

@Data
@AllArgsConstructor
class Tom {
    String name;
    Integer age;
}

有关JSONArray与JSONObject的更多相关文章

  1. 使用JSONObject与JSONArray进行解析json数据 - 2

    JSONObject:JSONObject只是一种数据结构,可以理解为JSON格式的数据结构(key-value 结构),可以使用put方法给json对象添加元素。JSONObject可以很方便的转换成字符串,也可以很方便的把其他对象转换成JSONObject对象。JSONArray:JSONArray是一个有序的值序列。它的外部文本形式是一个用方括号括起来的字符串,用逗号分隔值。内部表单是具有 索引的对象get和opt用于通过索引访问值的element方法,以及用于添加或替换值的方法在解析接口的时候会遇到内部混乱的接口,在解析这种情况中就会出现这种两种错误:bean类集合字段错误和内部类是汉

  2. javascript - GWT 对象参数从 javascript 到 java(JavaScriptObject 到 JSONObject) - 2

    我希望在GWT应用程序中将对象从JavaScript传递到Java。这个对象可以有任意字段。因此,它与仅传递数字的非常相似的问题不同。Passingjavascriptparameterfromexternaljavascripttojava我把回调定义成publicstaticvoidcbSysInfoSucces(JavaScriptObjecto1){}但我不知道如何将JavaScriptObject转换为JSONObject如果我想将Object传递给java,您能否就$entry()函数格式提出建议 最佳答案 使用构造函数

  3. java - JSONObject JSON 数组长度 - 2

    我正在用java读取以下XML,并将其转换为JSONObject[org.json.JSONObject]。并附加元数据并作为JSON返回。问题:JSONObjectjsonObj=service.getMyData();//自定义方法和调用intcount=jsonObj.length();//长度为1如何从这个jsonObj中获取正确的计数?.在这种情况下,我指的正确计数是2。[2本书]我试过什么?(1)System.out.println(jsonObj.length());//打印1API说:长度()获取存储在JSONObject中的键数。(2)由于返回的键数为1,因此尝试下面

  4. javascript - 为什么 JSONObject.length 未定义? - 2

    在下面的代码中,JSONObject.length为2:varJSONObject=[{"name":"JohnJohnson","street":"OsloWest16","age":33,"phone":"5551234567"},{"name":"JohnJohnson","street":"OsloWest16","age":33,"phone":"5551234567"}];但是,在下面的代码中,JSONObject.length是未定义的。为什么?varJSONObject={"name":"JohnJohnson","street":"OsloWest16","age":

  5. php - 在 PHP 中通过 JSONArray 进行 Foreach - 2

    我收到这个错误:Warning:Invalidargumentsuppliedforforeach()in[page].phponline49这是$json变量的回显:[{"d":"2011-03-26","q":1,"t":1060},{"d":"2011-03-26","q":2,"t":1060},{"d":"2011-03-26","q":1,"t":1060}]我正在尝试像这样迭代:foreach($jsonas$obj){// 最佳答案 只是一个猜测:您的$json变量是一个字符串。您需要使用json_decode将其转

  6. java - JSONObject 删除空值对 - 2

    这是我的Json文件:{"models":{},"path":[{"path":"/web-profiles","operations":[{"type":"","responseMessages":[]}]}],"produces":[]}如果键的值为空(包括[]、""、{})。如何从Json文件中删除这些对。我尝试使用JSONObject内置函数来删除不必要的对。但是,它没有用。我尝试使用字符串方法逐行处理。它有太多案例,我无法在我的代码中涵盖所有这些案例。(例如,子键'operations',当你想删除所有空值时,这个键(操作)值对也应该被删除。)有什么想法吗?

  7. java - 如何使用 Java 从 JSONArray 中删除重复对象并对其进行排序 - 2

    我的JSON是:[{"distance":32,"stationCode":"MIG","name":"Midghat","platforms":"2"},{"distance":32,"stationCode":"MIG","name":"Midghat","platforms":"2"},{"distance":69,"stationCode":"MDDP","name":"Mandideep","platforms":"2"},{"distance":69,"stationCode":"MDDP","name":"Mandideep","platforms":"2"},{"dis

  8. java - 如何将 JsonArray 转换为 Hashmap - 2

    我已经能够从json字符串中获取jsonarray,但不知道如何将它放入一个Hashmap中,其中一个字符串显示cargo类型,一个整数显示数量。字符串:"cargo":[{"type":"Coals","amount":75309},{"type":"Chemicals","amount":54454},{"type":"Food","amount":31659},{"type":"Oil","amount":18378}] 最佳答案 这为我解决了问题:JsonArrayjsoncargo=jsonObject.getJsonAr

  9. Java:通过 Parse.com REST API 将日期对象作为 JSONObject 发送 - 2

    我正在尝试使用HttpsUrlConnection通过Parse的RESTAPI在我的Parse.com数据库中创建一个新对象。他们的RESTAPI只接受JSON。我已经让一切正常工作,数据库将接受新的对象条目——除了我试图包含日期字段的时候。当我传入日期时,服务器完全拒绝该对象。我在他们的文档中找到了这个关于在使用RESTAPI时如何在对象中添加日期字段的描述:TheParsemobileclientlibrariesalsosupportdates,binarydata,andrelationaldata.IntheRESTAPI,thesevaluesareencodedasJS

  10. java - jsonObject as string - 搜索正则表达式以删除密码字段 - 2

    我有一个json字符串,它的内容中某处有一个像这样的字符串:"password":"password2"这可以在json字符串中的任何地方,所以不要假设它在第一层。它甚至可以在jsonArray中。所以我需要搜索整个字符串并删除这个字段,或者将它的值设置为null。所以我需要能够搜索整个字符串并替换密码。例如,字符串可能如下所示:我只是想用它来记录。我的问题是,我想删除与第三方共享的密码值。我需要在java中使用正则表达式来搜索此字符串并将密码值替换为空字符串,或者我什至可以对密码进行md5。如果不存在密码字符串,它一定不会失败。我怎样才能做到这一点?所以要清楚,给定任何输入作为字符串

随机推荐