json 转 map,循环得到 key,value

版权声明:本文为其他博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.youkuaiyun.com/stimgo/article/details/71750781

String str = "{\"0\":\"zhangsan\",\"1\":\"lisi\",\"2\":\"wangwu\",\"3\":\"maliu\"}";  
        //第一种方式  
        Map maps = (Map)JSON.parse(str);  
        System.out.println("这个是用JSON类来解析JSON字符串!!!");  
        for (Object map : maps.entrySet()){  
            System.out.println(((Map.Entry)map).getKey()+"     " + ((Map.Entry)map).getValue());  
        }  
        //第二种方式  
        Map mapTypes = JSON.parseObject(str);  
        System.out.println("这个是用JSON类的parseObject来解析JSON字符串!!!");  
        for (Object obj : mapTypes.keySet()){  
            System.out.println("key为:"+obj+"值为:"+mapTypes.get(obj));  
        }  
        //第三种方式  
        Map mapType = JSON.parseObject(str,Map.class);  
        System.out.println("这个是用JSON类,指定解析类型,来解析JSON字符串!!!");  
        for (Object obj : mapType.keySet()){  
            System.out.println("key为:"+obj+"值为:"+mapType.get(obj));  
        }  
        //第四种方式  
        /** 
         * JSONObject是Map接口的一个实现类 
         */  
        Map json = (Map) JSONObject.parse(str);  
        System.out.println("这个是用JSONObject类的parse方法来解析JSON字符串!!!");  
        for (Object map : json.entrySet()){  
            System.out.println(((Map.Entry)map).getKey()+"  "+((Map.Entry)map).getValue());  
        }  
        //第五种方式  
        /** 
         * JSONObject是Map接口的一个实现类 
         */  
        JSONObject jsonObject = JSONObject.parseObject(str);  
        System.out.println("这个是用JSONObject的parseObject方法来解析JSON字符串!!!");  
        for (Object map : json.entrySet()){  
            System.out.println(((Map.Entry)map).getKey()+"  "+((Map.Entry)map).getValue());  
        }  
        //第六种方式  
        /** 
         * JSONObject是Map接口的一个实现类 
         */  
        Map mapObj = JSONObject.parseObject(str,Map.class);  
        System.out.println("这个是用JSONObject的parseObject方法并执行返回类型来解析JSON字符串!!!");  
        for (Object map: json.entrySet()){  
            System.out.println(((Map.Entry)map).getKey()+"  "+((Map.Entry)map).getValue());  
        }  
        String strArr = "{{\"0\":\"zhangsan\",\"1\":\"lisi\",\"2\":\"wangwu\",\"3\":\"maliu\"}," +  
                "{\"00\":\"zhangsan\",\"11\":\"lisi\",\"22\":\"wangwu\",\"33\":\"maliu\"}}";  
       // JSONArray.parse()  
        System.out.println(json);  

 

<think>好的,我现在需要解决用户的问题,关于如何将JSONMap形式中的value换为对象格式。首先,我需要明确用户的需求。用户提到的“JSONMap形式”可能是指JSON对象中的某些值是以类似Map的结构存储的,比如键值对,但用户希望将这些值换为JavaScript的对象格式。 首先,我应该回忆一下JavaScript中Map和Object的区别。Map是ES6引入的数据结构,键可以是任意类型,而Object的键只能是字符串或Symbol。JSON本身不支持Map类型,所以当从JSON解析时,类似Map的结构实际上会被解析为普通对象。因此,用户的问题可能是指如何将普通对象中的值换为更复杂的对象,比如日期字符串为Date对象,或者其他嵌套结构的处理。 接下来,我需要考虑用户可能的实际应用场景。例如,从服务器接收的JSON数据中,某些字段可能是字符串形式,需要换为具体的对象实例,比如日期、自定义类实例等。这时候就需要在解析JSON时对这些值进行处理。 用户之前的提问是关于JSON.parse的,所以可能他们已经了解基本用法,现在需要更深入的应用,比如使用reviver函数来自定义解析过程。因此,我应该重点介绍如何使用JSON.parse的reviver参数来实现value换。 可能的步骤包括:首先解析JSON字符串,然后在解析过程中检查每个键值对,判断是否需要换。例如,如果某个键的值是日期字符串,就将其换为Date对象。或者,如果有嵌套的对象结构,可能需要递归处理。 需要注意的是,JSON.parse默认会将JSON对象换为普通的JavaScript对象,而不会自动处理特殊类型。因此,用户需要显式地在reviver函数中指定换逻辑。 此外,还需要提醒用户注意事项,比如确保JSON格式正确,处理可能的异常,以及换后的对象是否符合预期。例如,日期字符串的格式必须能被Date对象正确解析,否则会导致错误。 可能还需要举例说明,比如一个包含日期和嵌套对象的JSON字符串,如何通过reviver函数将其中的字符串换为对应的对象。这样用户能更直观地理解实现方法。 最后,需要总结常见的应用场景,比如处理API返回的数据,实现深拷贝时的类型恢复等。同时,对比其他语言中的类似操作,帮助用户更好地理解跨语言的处理方式。 在整理回答时,要确保结构清晰,分步骤说明,代码示例正确,并且注意事项突出显示,避免用户在使用过程中遇到常见错误。</think>--- 要将 JSONMap 形式(即键值对结构)中的 **value 换为特定对象格式**(例如日期、自定义对象等),可以通过 `JSON.parse` 的 **reviver 函数**或后续处理实现。以下是具体方法及示例: --- ### 一、使用 `JSON.parse` 的 reviver 函数 通过 `reviver` 在解析时动态value 格式。例如将字符串为 `Date` 对象: ```javascript const jsonStr = `{ "user": "Alice", "createdAt": "2023-10-05T12:00:00Z", "metadata": { "roles": ["admin", "editor"] } }`; const obj = JSON.parse(jsonStr, (key, value) => { // 换日期字符串为 Date 对象 if (key === "createdAt" && typeof value === "string") { return new Date(value); } // 保持其他值不变 return value; }); console.log(obj.createdAt instanceof Date); // true console.log(obj.metadata.roles); // ["admin", "editor"] ``` --- ### 二、手动遍历换 若 JSON 已解析为对象,可递归遍历并换特定字段: ```javascript function convertMapValues(obj) { for (const key in obj) { if (obj.hasOwnProperty(key)) { const value = obj[key]; // 换日期字符串 if (key === "createdAt" && typeof value === "string") { obj[key] = new Date(value); } // 递归处理嵌套对象 else if (typeof value === "object" && value !== null) { convertMapValues(value); } } } } const parsedObj = JSON.parse(jsonStr); convertMapValues(parsedObj); console.log(parsedObj.createdAt.getFullYear()); // 2023 ``` --- ### 三、自定义对象换 若需将 value 为复杂对象(如自定义类实例),可结合构造函数: ```javascript class UserProfile { constructor(data) { this.name = data.user; this.joinedAt = new Date(data.createdAt); } } const jsonStr = '{"user": "Bob", "createdAt": "2023-01-01"}'; const rawData = JSON.parse(jsonStr); const profile = new UserProfile(rawData); console.log(profile.joinedAt instanceof Date); // true ``` --- ### 四、注意事项 1. **JSON 格式限制**: - JSON 不支持 `Date`、`Map` 等特殊类型,需手动换。 - 嵌套对象需递归处理(如示例二)。 2. **错误处理**: ```javascript try { const obj = JSON.parse(jsonStr, reviverFunc); } catch (err) { console.error("解析失败:", err); } ``` 3. **性能考量**: - 对大型 JSON 数据,递归遍历可能影响性能,建议按需换。 --- ### 五、应用场景 1. 换 API 返回的日期字符串为 `Date` 对象。 2. 将扁平化数据为嵌套对象(如数据库查询结果)。 3. 恢复序列化前的对象类型(如配合 `JSON.stringify` 实现深拷贝)。 通过灵活使用 `reviver` 函数或自定义换逻辑,可高效处理 JSON 数据到对象格式的映射需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值