了解一下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>