YYPOST群发软件 发表于 3 天前

JSON.stringify 和 JSON.parse 完整示例



JSON.stringify 和 JSON.parse 完整示例





// 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 '';
      }
      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 = value;
},
getItem: function(key) {
    return this.data;
}
};

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 = config;
};

ProjectConfig.prototype.get = function(name) {
return this.configs || 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.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() {\\nvar data = null;\\nvar setData = function() {};\\n\\n// 模拟 useState\\n// 模拟 useEffect\\n// 模拟 fetch 数据\\nfunction fetchData() {\\n    // 模拟 API 调用\\n    var result = { title: \'Example Title\' };\\n    setData(result);\\n}\\n\\nreturn 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) {\\nthis.baseURL = baseURL;\\n}\\n\\nApiClient.prototype.request = function(endpoint, options) {\\noptions = options === undefined ? {} : options;\\nvar url = this.baseURL + endpoint;\\nvar config = {\\n    headers: {\\n      \'Content-Type\': \'application/json\'\\n    }\\n};\\n\\n// 合并选项\\nfor (var key in options) {\\n    if (options.hasOwnProperty(key)) {\\n      config = options;\\n    }\\n}\\n\\nreturn {\\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;
    if (!(field in obj)) {
      missing.push(field);
    } else if (obj === null || obj === undefined || obj === '') {
      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("&#128161; 这些技巧在实际项目开发中非常有用!");
print.log("所有JSON操作示例已完成!");

页: [1]
查看完整版本: JSON.stringify 和 JSON.parse 完整示例