自动发帖软件
标题:
JSON.stringify 和 JSON.parse 完整示例
[打印本页]
作者:
发帖软件
时间:
前天 09:50
标题:
JSON.stringify 和 JSON.parse 完整示例
JSON.stringify 和 JSON.parse 完整示例
2.png
(815.42 KB, 下载次数: 0)
前天 09:50
上传
1.png
(863.69 KB, 下载次数: 0)
前天 09:50
上传
// JSON.stringify 和 JSON.parse 完整示例 - AIWROK IDE 开发 (ES5 兼容)
// 展示从基础到高级的所有 JSON 处理技巧
// ES5系统安卓 JavaScript引擎Rhino
//🍎交流QQ群711841924群一,苹果内测群,528816639
logWindow.show()
logWindow.setAlpha(300)
logWindow.setHeight(2000)
logWindow.setWidth(1800)
// Rhino兼容的日期格式化函数
function formatDateToString(date) {
if (!(date instanceof Date)) {
return date;
}
var year = date.getFullYear();
var month = date.getMonth() + 1;
var day = date.getDate();
var hours = date.getHours();
var minutes = date.getMinutes();
var seconds = date.getSeconds();
var milliseconds = date.getMilliseconds();
// 补零函数
function pad(num) {
return num < 10 ? '0' + num : '' + num;
}
// 补零函数(3位毫秒)
function pad3(num) {
if (num < 10) return '00' + num;
if (num < 100) return '0' + num;
return '' + num;
}
return year + '-' + pad(month) + '-' + pad(day) + 'T' +
pad(hours) + ':' + pad(minutes) + ':' + pad(seconds) +
'.' + pad3(milliseconds) + 'Z';
}
// Rhino兼容的日期解析函数
function parseDateFromString(dateString) {
if (typeof dateString !== 'string') {
return dateString;
}
// 检查是否是标准日期格式
var dateRegex = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d{3})?Z$/;
if (!dateRegex.test(dateString)) {
return dateString;
}
try {
return new Date(dateString);
} catch (err) {
printl("日期解析错误:", err);
print.log("无法解析日期字符串:", dateString);
return dateString;
}
}
// ==================== 1. 基础用法 ====================
var user = {
name: 'AIWROK Developer',
age: 25,
skills: ['JavaScript', 'React Native', 'Node.js'],
active: true
};
printl("1. 基础用法");
print.log("=== JSON 基础用法 ===");
// 基本序列化
var jsonStr = JSON.stringify(user);
printl("序列化结果:", jsonStr);
print.log("JSON.stringify(user):", jsonStr);
// 基本反序列化
var parsedUser = JSON.parse(jsonStr);
printl("反序列化结果:", parsedUser);
print.log("JSON.parse(jsonStr):", parsedUser);
// ==================== 2. 美化输出 ====================
printl("");
print.log("=== 2. 美化输出 ===");
var config = {
app: 'AIWROK IDE',
version: '2.1.0',
settings: {
theme: 'dark',
autoSave: true,
ai: {
enabled: true,
suggestions: true
}
}
};
printl("原始配置对象:", config);
print.log("config对象:", config);
// 美化输出
var prettyConfig = JSON.stringify(config, null, 2);
printl("美化输出结果:", prettyConfig);
print.log("JSON.stringify(config, null, 2):", prettyConfig);
// ==================== 3. 自定义序列化 (replacer) ====================
printl("");
print.log("=== 3. 自定义序列化 (replacer) ===");
var dataWithDate = {
name: 'AIWROK 配置',
created: new Date('2023-06-01'),
lastModified: new Date(),
version: '1.0.0',
features: ['darkMode', 'autoSave', 'aiSuggestions']
};
printl("包含Date对象的数据:", dataWithDate);
print.log("原始dataWithDate:", dataWithDate);
// 自定义 replacer 函数,将 Date 转换为字符串
var serializedData = JSON.stringify(dataWithDate, function(key, value) {
if (value instanceof Date) {
return formatDateToString(value);
}
return value;
}, 2);
printl("序列化后 (Date转字符串):", serializedData);
print.log("使用replacer后的JSON:", serializedData);
// ==================== 4. 自定义反序列化 (reviver) ====================
printl("");
print.log("=== 4. 自定义反序列化 (reviver) ===");
// 自定义反序列化函数
function customReviver(key, value) {
// 检查是否是日期字符串格式
return parseDateFromString(value);
}
printl("自定义reviver函数已定义");
print.log("customReviver函数: 自动转换日期字符串为Date对象");
var deserializedData = JSON.parse(serializedData, customReviver);
printl("反序列化结果:", deserializedData);
print.log("JSON.parse(serializedData, customReviver):", deserializedData);
// ==================== 5. 属性过滤 ====================
printl("");
print.log("=== 5. 属性过滤 ===");
// 过滤敏感信息的函数
var sensitiveData = {
id: 12345,
username: 'aiwrok_dev',
email: 'dev@aiwrok.com',
password: 'secret123',
accessToken: 'abc123xyz',
profile: {
realName: 'AIWROK Developer',
phone: '13800138000',
address: '北京市朝阳区'
}
};
printl("原始敏感数据:", sensitiveData);
print.log("包含密码等敏感信息的数据:", sensitiveData);
var filteredJson = JSON.stringify(sensitiveData, function(key, value) {
if (key === 'password' || key === 'accessToken' || key === 'phone' || key === 'address') {
return undefined;
}
return value;
}, 2);
printl("过滤后的JSON:", filteredJson);
print.log("移除敏感信息后的结果:", filteredJson);
// ==================== 6. 数组处理 ====================
printl("");
print.log("=== 6. 数组处理 ===");
var projects = [
{
name: 'AIWROK IDE',
type: 'ide',
technologies: ['React', 'Electron', 'Node.js'],
status: 'active',
startDate: new Date('2023-06-01')
},
{
name: 'AIWROK Web IDE',
type: 'web',
technologies: ['React', 'Node.js', 'Monaco Editor'],
status: 'planning',
startDate: new Date('2024-01-15')
},
{
name: 'AIWROK API',
type: 'api',
technologies: ['Express', 'MongoDB', 'JWT'],
status: 'active',
startDate: new Date('2023-09-01')
}
];
printl("项目数组:", projects);
print.log("包含Date对象的数组:", projects);
// 序列化数组
var projectsJson = JSON.stringify(projects, function(key, value) {
if (key === 'startDate') {
return formatDateToString(value);
}
return value;
}, 2);
printl("序列化后的项目数组:", projectsJson);
print.log("Date对象转换为字符串:", projectsJson);
// 反序列化数组
var parsedProjects = JSON.parse(projectsJson, function(key, value) {
if (key === 'startDate') {
return parseDateFromString(value);
}
return value;
});
printl("反序列化后的项目数组:", parsedProjects);
print.log("字符串转换回Date对象:", parsedProjects);
// ==================== 7. 错误处理 ====================
printl("");
print.log("=== 7. 错误处理 ===");
// 安全解析函数
function safeParse(jsonString, fallback) {
fallback = fallback === undefined ? null : fallback;
try {
return JSON.parse(jsonString);
} catch (err) {
printl("JSON解析错误:", err);
print.log("解析失败,返回默认值:", fallback);
return fallback;
}
}
// 安全序列化函数 - 处理循环引用
function safeStringify(obj, space) {
space = space === undefined ? 0 : space;
var visited = [];
function replacer(key, value) {
if (typeof value === 'object' && value !== null) {
// 检查循环引用
if (visited.indexOf(value) !== -1) {
return '[Circular Reference]';
}
visited.push(value);
}
return value;
}
try {
return JSON.stringify(obj, replacer, space);
} catch (err) {
printl("JSON序列化错误:", err);
print.log("序列化失败,返回空对象");
return '{}';
}
}
printl("安全解析和序列化函数已定义");
print.log("包含错误处理的工具函数");
// 测试有效和无效的 JSON
var validJson = '{"message": "Hello, AIWROK!", "status": "success"}';
var invalidJson = '{"message": "Hello, AIWROK!", "status": }';
printl("测试有效JSON:", validJson);
print.log("validJson:", validJson);
var validResult = safeParse(validJson);
printl("有效JSON解析结果:", validResult);
print.log("safeParse(validJson):", validResult);
printl("测试无效JSON:", invalidJson);
print.log("invalidJson:", invalidJson);
var invalidResult = safeParse(invalidJson);
printl("无效JSON解析结果:", invalidResult);
print.log("safeParse(invalidJson):", invalidResult);
// 测试循环引用
var circularObj = { name: 'AIWROK' };
circularObj.self = circularObj;
printl("测试循环引用对象:", safeStringify(circularObj, 2));
print.log("circularObj包含自引用");
var circularResult = safeStringify(circularObj);
printl("循环引用序列化结果:", circularResult);
print.log("safeStringify(circularObj):", circularResult);
// ==================== 8. 实际应用示例 - 用户会话管理 ====================
printl("");
print.log("=== 8. 用户会话管理 ===");
// 用户会话类
function UserSession(userData) {
this.user = userData;
this.loginTime = new Date();
this.lastActivity = new Date();
this.sessionId = this.generateSessionId();
}
UserSession.prototype.generateSessionId = function() {
return 'sess_' + Math.random().toString(36).substr(2, 9);
};
UserSession.prototype.updateActivity = function() {
this.lastActivity = new Date();
};
UserSession.prototype.getSessionInfo = function() {
return {
sessionId: this.sessionId,
user: this.user,
loginTime: formatDateToString(this.loginTime),
lastActivity: formatDateToString(this.lastActivity),
isActive: this.isSessionActive()
};
};
UserSession.prototype.isSessionActive = function() {
var now = new Date();
var timeDiff = now - this.lastActivity;
return timeDiff < 30 * 60 * 1000; // 30分钟无活动视为过期
};
UserSession.prototype.serialize = function() {
var self = this;
return JSON.stringify(this, function(key, value) {
if (key === 'loginTime' || key === 'lastActivity') {
return formatDateToString(value);
}
// 避免序列化原型链上的方法
if (typeof value === 'function') {
return undefined;
}
return value;
});
};
UserSession.prototype.deserialize = function(jsonString) {
try {
var data = JSON.parse(jsonString);
this.user = data.user;
this.loginTime = parseDateFromString(data.loginTime);
this.lastActivity = parseDateFromString(data.lastActivity);
this.sessionId = data.sessionId;
return true;
} catch (err) {
printl("会话反序列化错误:", err);
print.log("恢复会话失败:", err);
return false;
}
};
printl("UserSession类已定义");
print.log("包含序列化、反序列化等方法");
// 创建用户会话
var userData = {
id: 1001,
username: 'aiwrok_dev',
permissions: ['read', 'write', 'admin']
};
var session = new UserSession(userData);
printl("创建用户会话:", session.getSessionInfo());
print.log("session对象:", session.getSessionInfo());
// 保存会话到本地存储
var sessionJson = session.serialize();
printl("序列化后的会话数据:", sessionJson);
print.log("session.serialize():", sessionJson);
var mockStorage = {
data: {},
setItem: function(key, value) {
this.data[key] = value;
},
getItem: function(key) {
return this.data[key];
}
};
mockStorage.setItem('aiwrok_user_session', sessionJson);
printl("会话数据已保存到存储");
print.log("保存到localStorage模拟");
// 从本地存储恢复会话
var restoredSession = new UserSession({});
var sessionData = mockStorage.getItem('aiwrok_user_session');
if (restoredSession.deserialize(sessionData)) {
printl("会话恢复成功:", restoredSession.getSessionInfo());
print.log("会话恢复成功:", restoredSession.getSessionInfo());
} else {
printl("会话恢复失败");
print.log("恢复失败,可能是数据损坏");
}
// ==================== 9. 项目配置管理 ====================
printl("");
print.log("=== 9. 项目配置管理 ===");
// 项目配置类
function ProjectConfig() {
this.configs = {};
}
ProjectConfig.prototype.save = function(name, config) {
this.configs[name] = config;
};
ProjectConfig.prototype.get = function(name) {
return this.configs[name] || null;
};
ProjectConfig.prototype.getAll = function() {
return this.configs;
};
printl("ProjectConfig类已定义");
print.log("配置管理类: save, get, getAll方法");
var projectConfig = {
name: 'AIWROK IDE Project',
version: '2.1.0',
created: new Date('2023-06-01'),
lastModified: new Date(),
features: {
darkMode: true,
autoSave: true,
intelliSense: true,
codeFormatting: true
},
dependencies: {
core: ['react', 'react-native'],
dev: ['jest', 'eslint', 'prettier'],
ui: ['react-native-vector-icons', 'react-native-gesture-handler']
}
};
printl("项目配置对象:", projectConfig);
print.log("包含Date对象和嵌套对象");
// 保存项目配置到本地存储
function saveProjectConfig(config) {
var serialized = JSON.stringify(config, function(key, value) {
if (value instanceof Date) {
return formatDateToString(value);
}
return value;
}, 2);
// 模拟 localStorage 保存
mockStorage.setItem('aiwrok_project_config', serialized);
return serialized;
}
// 加载项目配置
function loadProjectConfig() {
var stored = mockStorage.getItem('aiwrok_project_config');
if (!stored) return null;
try {
return JSON.parse(stored, function(key, value) {
// 自动转换日期字符串为 Date 对象
if (key === 'created' || key === 'lastModified') {
return parseDateFromString(value);
}
return value;
});
} catch (err) {
printl("加载配置错误:", err);
print.log("配置解析失败:", err);
return null;
}
}
printl("配置保存和加载函数已定义");
print.log("自动处理Date对象转换");
var savedConfig = saveProjectConfig(projectConfig);
printl("保存配置结果:", savedConfig);
print.log("saveProjectConfig返回:", savedConfig);
var loadedConfig = loadProjectConfig();
printl("加载配置结果:", loadedConfig);
print.log("loadProjectConfig返回:", loadedConfig);
if (loadedConfig && loadedConfig.created instanceof Date) {
printl("Date对象恢复成功");
print.log("loadedConfig.created是Date对象:", loadedConfig.created);
} else {
printl("Date对象恢复失败");
print.log("loadedConfig.created不是Date对象");
}
// ==================== 10. 代码片段管理 ====================
printl("");
print.log("=== 10. 代码片段管理 ===");
// 代码片段存储
function CodeSnippetManager() {
this.snippets = [];
}
CodeSnippetManager.prototype.addSnippet = function(name, language, code, description) {
description = description === undefined ? '' : description;
var snippet = {
id: Date.now(),
name: name,
language: language,
code: code,
description: description,
createdAt: new Date(),
tags: this.extractTags(code)
};
this.snippets.push(snippet);
return snippet;
};
CodeSnippetManager.prototype.extractTags = function(code) {
var commonPatterns = {
'React': /import.*from\s+['"]react['"]/,
'React Native': /from\s+['"]react-native['"]/,
'API': /fetch\(|axios\./,
'Async': /async\s+|await\s+/,
'ES6': /const\s+|let\s+|=>/
};
var tags = [];
for (var keyword in commonPatterns) {
if (commonPatterns.hasOwnProperty(keyword) && commonPatterns[keyword].test(code)) {
tags.push(keyword.toLowerCase());
}
}
return tags;
};
CodeSnippetManager.prototype.searchSnippets = function(keyword) {
return this.snippets.filter(function(snippet) {
return snippet.name.toLowerCase().indexOf(keyword.toLowerCase()) !== -1 ||
snippet.code.toLowerCase().indexOf(keyword.toLowerCase()) !== -1 ||
snippet.description.toLowerCase().indexOf(keyword.toLowerCase()) !== -1 ||
snippet.tags.some(function(tag) { return tag.indexOf(keyword.toLowerCase()) !== -1; });
});
};
CodeSnippetManager.prototype.exportSnippets = function() {
return JSON.stringify(this.snippets, function(key, value) {
if (key === 'createdAt') {
return formatDateToString(value);
}
return value;
}, 2);
};
CodeSnippetManager.prototype.importSnippets = function(jsonString) {
try {
var snippets = JSON.parse(jsonString, function(key, value) {
if (key === 'createdAt') {
return parseDateFromString(value);
}
return value;
});
this.snippets = snippets;
return true;
} catch (err) {
printl("导入代码片段错误:", err);
print.log("导入失败:", err);
return false;
}
};
CodeSnippetManager.prototype.saveToStorage = function() {
var data = {
snippets: this.snippets,
exportedAt: new Date()
};
var serialized = JSON.stringify(data, function(key, value) {
if (value instanceof Date) {
return formatDateToString(value);
}
return value;
}, 2);
mockStorage.setItem('aiwrok_code_snippets', serialized);
};
CodeSnippetManager.prototype.loadFromStorage = function() {
var stored = mockStorage.getItem('aiwrok_code_snippets');
if (!stored) return false;
try {
var data = JSON.parse(stored, function(key, value) {
if (key === 'exportedAt' || key === 'createdAt') {
return parseDateFromString(value);
}
return value;
});
this.snippets = data.snippets;
return true;
} catch (err) {
printl("加载代码片段错误:", err);
print.log("加载失败:", err);
return false;
}
};
printl("CodeSnippetManager类已定义");
print.log("包含添加、搜索、导入导出等功能");
// 创建代码片段管理器
var snippetManager = new CodeSnippetManager();
printl("创建代码片段管理器");
print.log("snippetManager实例已创建");
// 添加示例代码片段
var snippet1 = snippetManager.addSnippet(
'React Hook',
'javascript',
'import React from \'react\';\\n\\nvar MyComponent = function() {\\n var data = null;\\n var setData = function() {};\\n \\n // 模拟 useState\\n // 模拟 useEffect\\n // 模拟 fetch 数据\\n function fetchData() {\\n // 模拟 API 调用\\n var result = { title: \'Example Title\' };\\n setData(result);\\n }\\n \\n return React.createElement(\'div\', null, data ? data.title : \'Loading...\');\\n};\\n\\nmodule.exports = MyComponent;',
'React 组件模板 (ES5 版本)'
);
printl("添加代码片段1:", snippet1.name);
print.log("snippet1:", snippet1.name);
var snippet2 = snippetManager.addSnippet(
'API 客户端',
'javascript',
'function ApiClient(baseURL) {\\n this.baseURL = baseURL;\\n}\\n\\nApiClient.prototype.request = function(endpoint, options) {\\n options = options === undefined ? {} : options;\\n var url = this.baseURL + endpoint;\\n var config = {\\n headers: {\\n \'Content-Type\': \'application/json\'\\n }\\n };\\n \\n // 合并选项\\n for (var key in options) {\\n if (options.hasOwnProperty(key)) {\\n config[key] = options[key];\\n }\\n }\\n \\n return {\\n success: true,\\n data: { message: \'Example API response\' },\\n config: config\\n };\\n};\\n\\n// 使用示例\\nvar api = new ApiClient(\'https://api.example.com\');\\nvar response = api.request(\'/users\');',
'通用 API 客户端类 (ES5 版本)'
);
printl("添加代码片段2:", snippet2.name);
print.log("snippet2:", snippet2.name);
// 保存到本地存储
snippetManager.saveToStorage();
printl("代码片段已保存到存储");
print.log("保存到localStorage模拟");
// 搜索功能测试
var searchResults = snippetManager.searchSnippets('react');
printl("搜索'react'的结果:", searchResults.length, "个片段");
print.log("搜索结果:", searchResults.length);
// 导出代码片段
var exportedSnippets = snippetManager.exportSnippets();
printl("导出的代码片段JSON:", exportedSnippets);
print.log("exportSnippets():", exportedSnippets);
// ==================== 11. 性能对比演示 ====================
printl("");
print.log("=== 11. 性能对比演示 ===");
// 创建测试数据
var testData = {
largeArray: [],
summary: {
total: 1000,
active: 500,
inactive: 500
}
};
printl("创建测试数据对象");
print.log("包含1000个项目的数组");
for (var k = 0; k < 1000; k++) {
testData.largeArray.push({
id: k,
name: '项目 ' + k,
status: k % 2 === 0 ? 'active' : 'inactive',
metadata: {
created: new Date(),
tags: ['tag1', 'tag2', 'tag3'],
config: { enabled: true, priority: k }
}
});
}
printl("测试数据创建完成,共", testData.largeArray.length, "个项目");
print.log("testData包含", testData.largeArray.length, "个项目");
// 测试序列化性能
var startTime = Date.now();
var serializedLarge = JSON.stringify(testData);
var serializeTime = Date.now() - startTime;
printl("序列化耗时:", serializeTime, "毫秒");
print.log("JSON.stringify耗时:", serializeTime, "ms");
var startTime2 = Date.now();
var deserializedLarge = JSON.parse(serializedLarge);
var deserializeTime = Date.now() - startTime2;
printl("反序列化耗时:", deserializeTime, "毫秒");
print.log("JSON.parse耗时:", deserializeTime, "ms");
printl("总耗时:", serializeTime + deserializeTime, "毫秒");
print.log("完整JSON操作总耗时:", serializeTime + deserializeTime, "ms");
// ==================== 12. JSON 工具函数 ====================
printl("");
print.log("=== 12. JSON 工具函数 ===");
function JsonUtils() {}
JsonUtils.isValidJSON = function(str) {
try {
JSON.parse(str);
return true;
} catch (e) {
return false;
}
};
JsonUtils.safeStringify = function(obj, fallback, replacer) {
fallback = fallback === undefined ? '{}' : fallback;
replacer = replacer === undefined ? null : replacer;
try {
return JSON.stringify(obj, replacer, 2);
} catch (err) {
printl("safeStringify错误:", err);
print.log("安全序列化失败:", err);
return fallback;
}
};
JsonUtils.safeParse = function(str, fallback, reviver) {
fallback = fallback === undefined ? null : fallback;
reviver = reviver === undefined ? null : reviver;
try {
return JSON.parse(str, reviver);
} catch (err) {
printl("safeParse错误:", err);
print.log("安全解析失败:", err);
return fallback;
}
};
JsonUtils.validateObjectStructure = function(obj, requiredFields) {
var missing = [];
var invalid = [];
for (var m = 0; m < requiredFields.length; m++) {
var field = requiredFields[m];
if (!(field in obj)) {
missing.push(field);
} else if (obj[field] === null || obj[field] === undefined || obj[field] === '') {
invalid.push(field);
}
}
return {
isValid: missing.length === 0 && invalid.length === 0,
missing: missing,
invalid: invalid
};
};
printl("JsonUtils工具类已定义");
print.log("包含isValidJSON, safeStringify, safeParse, validateObjectStructure");
// 测试 JSON 工具
var testValidJSON = '{"name": "AIWROK", "version": "1.0.0"}';
var testInvalidJSON = '{"name": "AIWROK", "version": }';
printl("测试有效JSON:", testValidJSON);
print.log("testValidJSON:", testValidJSON);
var validResult = JsonUtils.isValidJSON(testValidJSON);
printl("有效JSON验证结果:", validResult);
print.log("JsonUtils.isValidJSON(testValidJSON):", validResult);
printl("测试无效JSON:", testInvalidJSON);
print.log("testInvalidJSON:", testInvalidJSON);
var invalidResult = JsonUtils.isValidJSON(testInvalidJSON);
printl("无效JSON验证结果:", invalidResult);
print.log("JsonUtils.isValidJSON(testInvalidJSON):", invalidResult);
var safeParsed = JsonUtils.safeParse(testInvalidJSON, { error: true });
printl("安全解析结果:", safeParsed);
print.log("JsonUtils.safeParse(testInvalidJSON):", safeParsed);
var testObj = { name: 'AIWROK', version: '1.0.0' };
var required = ['name', 'version', 'author'];
var validation = JsonUtils.validateObjectStructure(testObj, required);
printl("对象结构验证:", validation);
print.log("JsonUtils.validateObjectStructure:", validation);
printl("");
print.log("=== JSON处理完整示例完成 ===");
printl("💡 这些技巧在实际项目开发中非常有用!");
print.log("所有JSON操作示例已完成!");
复制代码
欢迎光临 自动发帖软件 (http://www.fatiegongju.com/)
Powered by Discuz! X3.2