了解一下json是什么
学校里面只是很浅的学习过json,好了话不多说,咱们直接开始,温故而知新
它是啥?
json全名为JavaScript Object Notation,看到json我们总会和联想到一起,因为json里面有它名字,格式也与js中对象(object)并无差别,但值得注意的是:json虽然是基于ECMAScript语法的,但并不意味着必须要在js中使用,只是因为语法相似,js的开发者能更快的上手。
几乎所有的编程语言都对json的数据转换的支持
js中,json与对象的转换:JSON.parse()/JSON.stringify();
java中,json与对象的转换:fromJson()/toJson();
python中,json与对象的转换:json.dumps()/json.loads();
json格式
花括弧,方括弧,冒号和逗号
花括弧表示一个“容器”
方括号装载数组
名称和值用冒号隔开
数组元素通过逗号隔开
好了json也了解的差不多了解了,咱们言归正传看看题目要求
源代码在文章最后,需要的自取
其实它要求不怎么复杂这个题,主要我第一次搞这玩意,刚开始我准备用python来写的,奈何水平有限,转换成json文件时候输出为null或{},解决不了我就换了,用js来写,下面是代码。
<script> fetch("./params.json") //运行浏览器报了跨域的错,先开始我以为是绝对路径的问题,修改成相对路径还是报错,去搜了下fetch的涵义,是可能会造成异步操作,就是fetch还没有读取完json文件,就开始运行下面的代码了 //解决方法,用的本地服务器运行的就不会报错,转换后输出的为json字符串 .then((response) => response.json()) .then((paramsJson) => { const targetDict = {}; // 遍历 paramsJson 对象的每一个属性 Object.entries(paramsJson).forEach(([objName, objData]) => { // 判断是否需要转换 if ( objName !== "g_unKown" && objData.Attributes.id && objData.Attributes.id < 8000 ) { // 获取对象的 id 和 show 属性 const objId = objData.Attributes.id; const objShow = objData.Attributes.show || ""; // 获取父对象的 Attributes 属性 const parentAttributes = objData.Attributes; // 获取子对象的 nickName 属性 const childNickName = Object.entries(objData) .filter(([key, value]) => key !== "Attributes") .map(([key,value]) => { // 获取兄弟对象的 show 属性 const siblingShow = parentAttributes[key].Attributes.show || ""; // 拼接子对象的 nickName return `${siblingShow}_${value.Attributes.show}`; }) .join(", "); // 将转换后的数据存储到 targetDict 中 targetDict[`flaw_type_${objId}`] = { name: `flaw_type_${objId}`, nickName: `${objShow}_${childNickName}`, }; } }); // 将转换后的数据输出为 JSON 字符串 const targetJson = JSON.stringify(targetDict, null, 2); console.log(targetJson); }); </script>
复制
<script> // 创建 XMLHttpRequest 对象 const xhr = new XMLHttpRequest(); // 打开请求 xhr.open("GET", "./params.json"); // 设置响应类型为 JSON xhr.responseType = "json"; // 设置响应处理函数 xhr.onload = function () { // 判断请求是否成功 if (xhr.status === 200) { // 获取响应数据 const paramsJson = xhr.response; // 创建一个空对象,用于存储转换后的数据 const targetDict = {}; // 遍历 paramsJson 对象的每一个属性 Object.entries(paramsJson).forEach(([objName, objData]) => { // 判断是否需要转换 if ( objName !== "g_unKown" && objData.Attributes.id && objData.Attributes.id < 8000 ) { // 获取对象的 id 和 show 属性 const objId = objData.Attributes.id; const objShow = objData.Attributes.show || ""; // 获取父对象的 Attributes 属性 const parentAttributes = objData.Attributes; 遍历子对象的 Level 属性 const childNickName = Object.entries(objData) .filter(([key, value]) => key !== "Attributes" && key.startsWith("Level")) // 过滤掉 Attributes 属性和非 Level 属性 .map(([key,value]) => { const siblingAttributes = parentAttributes[key]; // 获取兄弟对象的 Attributes 属性 if (siblingAttributes && siblingAttributes.Attributes) { // 如果兄弟对象存在 Attributes 属性,则获取其 show 属性,并拼接成子对象的 nickName 属性 const siblingShow = siblingAttributes.Attributes.show || ""; return `${siblingShow}_${value.Attributes.show}`; } else { // 否则返回空字符串 return ""; } }) .filter((value) => value !== "") // 过滤掉值为空字符串的元素 .join(", "); // 将数组元素拼接成一个字符串 // 将转换后的数据存储到 targetDict 对象中 targetDict[`flaw_type_${objId}`] = { name: `flaw_type_${objId}`, nickName: `${objShow}_${childNickName}`, }; } }); // 将 targetDict 对象转换为 JSON 格式的字符串 const targetJson= JSON.stringify(targetDict, null, 2); // 输出转换后的 JSON 数据 console.log(targetJson); } else { // 如果请求失败,则输出错误信息 console.error(`请求失败:${xhr.status}`); } }; // 发送请求 xhr.send(); </script>
复制