JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,也易于机器解析和生成。解析JSON是指将JSON格式的字符串转换为程序可操作的数据结构(如对象、数组等)的过程。
递归方法是通过函数自我调用来遍历JSON结构,特别适合处理嵌套的JSON数据。
function parseJsonRecursively(data) {
if (typeof data !== 'object' || data === null) {
// 基本类型直接返回
return data;
}
if (Array.isArray(data)) {
// 处理数组
return data.map(item => parseJsonRecursively(item));
}
// 处理对象
const result = {};
for (const key in data) {
if (data.hasOwnProperty(key)) {
result[key] = parseJsonRecursively(data[key]);
}
}
return result;
}
// 使用示例
const jsonString = '{"name":"John","age":30,"address":{"city":"New York","zip":10001},"hobbies":["reading","swimming"]}';
const jsonObj = JSON.parse(jsonString);
const parsedData = parseJsonRecursively(jsonObj);
console.log(parsedData);
循环方法使用迭代而非递归来遍历JSON结构,通常需要借助栈或队列等数据结构。
function parseJsonIteratively(data) {
const stack = [{ data, result: Array.isArray(data) ? [] : {} }];
const root = stack[0].result;
while (stack.length > 0) {
const current = stack.pop();
const { data, result, key } = current;
if (Array.isArray(data)) {
for (let i = 0; i < data.length; i++) {
const item = data[i];
if (typeof item === 'object' && item !== null) {
const newResult = Array.isArray(item) ? [] : {};
result[i] = newResult;
stack.push({ data: item, result: newResult });
} else {
result[i] = item;
}
}
} else if (typeof data === 'object' && data !== null) {
for (const k in data) {
if (data.hasOwnProperty(k)) {
const value = data[k];
if (typeof value === 'object' && value !== null) {
const newResult = Array.isArray(value) ? [] : {};
result[k] = newResult;
stack.push({ data: value, result: newResult });
} else {
result[k] = value;
}
}
}
}
}
return root;
}
// 使用示例
const jsonString = '{"name":"John","age":30,"address":{"city":"New York","zip":10001},"hobbies":["reading","swimming"]}';
const jsonObj = JSON.parse(jsonString);
const parsedData = parseJsonIteratively(jsonObj);
console.log(parsedData);
问题1:解析大型JSON时出现栈溢出
问题2:解析含有循环引用的JSON
问题3:解析性能低下
import json
def parse_json_recursively(data):
if isinstance(data, dict):
return {k: parse_json_recursively(v) for k, v in data.items()}
elif isinstance(data, list):
return [parse_json_recursively(item) for item in data]
else:
return data
# 使用示例
json_string = '{"name":"John","age":30,"address":{"city":"New York","zip":10001},"hobbies":["reading","swimming"]}'
json_obj = json.loads(json_string)
parsed_data = parse_json_recursively(json_obj)
print(parsed_data)
import org.json.JSONArray;
import org.json.JSONObject;
import java.util.Stack;
public class JsonParser {
public static Object parseJsonIteratively(Object data) {
if (data instanceof JSONObject) {
JSONObject jsonObj = (JSONObject) data;
JSONObject result = new JSONObject();
Stack<Object[]> stack = new Stack<>();
stack.push(new Object[]{jsonObj, result});
while (!stack.isEmpty()) {
Object[] current = stack.pop();
JSONObject currentObj = (JSONObject) current[0];
JSONObject currentResult = (JSONObject) current[1];
for (String key : currentObj.keySet()) {
Object value = currentObj.get(key);
if (value instanceof JSONObject) {
JSONObject newResult = new JSONObject();
currentResult.put(key, newResult);
stack.push(new Object[]{value, newResult});
} else if (value instanceof JSONArray) {
JSONArray newResult = new JSONArray();
currentResult.put(key, newResult);
stack.push(new Object[]{value, newResult});
} else {
currentResult.put(key, value);
}
}
}
return result;
} else if (data instanceof JSONArray) {
// 类似处理数组的逻辑
// ...
}
return data;
}
public static void main(String[] args) {
String jsonString = "{\"name\":\"John\",\"age\":30,\"address\":{\"city\":\"New York\",\"zip\":10001},\"hobbies\":[\"reading\",\"swimming\"]}";
JSONObject jsonObj = new JSONObject(jsonString);
Object parsedData = parseJsonIteratively(jsonObj);
System.out.println(parsedData.toString());
}
}
在实际开发中,大多数情况下可以直接使用语言内置的JSON解析功能(如JavaScript的JSON.parse()
),只有在需要特殊处理或自定义解析逻辑时才需要手动实现递归或循环解析。
没有搜到相关的文章