[英]How to extract some data from a json file
我想从 json 文件中提取一些数据并将其插入到另一个 json 文件中,如下所示:
{
"name": "File",
"artist": "Andrew",
"attributes":
[
{
"trait_type": "Background",
"value": "Black"
},
{
"trait_type": "Base",
"value": "White"
},
{
"trait_type": "Eye Type",
"value": "Eye"
},
{
"trait_type": "Ear Type",
"value": "Ear"
},
{
"trait_type": "Tail Type",
"value": "Tail"
},
{
"trait_type": "Headwear",
"value": "Hat"
},
{
"trait_type": "Mouth Accessories",
"value": "Cigarette"
},
{
"trait_type": "Eye Accessories",
"value": "Mask"
},
{
"trait_type": "Ear Accessories",
"value": "Headphones"
},
{
"trait_type": "Details",
"value": "Headband"
}
],
},
{
"name": "File2",
"artist": "Andrew",
"attributes":
[
{
"trait_type": "Background",
"value": "White"
},
{
"trait_type": "Base",
"value": "Black"
},
{
"trait_type": "Eye Type",
"value": "Eye"
},
{
"trait_type": "Ear Type",
"value": "Ear"
},
{
"trait_type": "Tail Type",
"value": "Tail"
},
{
"trait_type": "Headwear",
"value": "Hat"
},
{
"trait_type": "Mouth Accessories",
"value": "Cigarette"
},
{
"trait_type": "Eye Accessories",
"value": "Mask"
},
{
"trait_type": "Ear Accessories",
"value": "Headphones"
},
{
"trait_type": "Details",
"value": "Headband"
}
],
},
至
[
{
"Background": "Black",
"Base": "White",
"Eye Type": "Eye",
"Ear Type": "Ear",
"Tail Type": "Tail",
"Headwear": "Hat",
"Mouth Accessories": "Cigarette",
"Eye Accessories": "Mask",
"Ear Accessories": "Headphones",
"Details": "Headband",
"tokenId": 0
},
{
"Background": "White",
"Base": "Black",
"Eye Type": "Eye",
"Ear Type": "Ear",
"Tail Type": "Tail",
"Headwear": "Hat",
"Mouth Accessories": "Cigarette",
"Eye Accessories": "Mask",
"Ear Accessories": "Headphones",
"Details": "Headband",
"tokenId": 1
},
]
第一个json文件数据很多,为了不写太长的代码,我只放了两个例子。 在新文件中,常量是“Background”、“Base”……最后一个值是“tokenId”,它会逐渐增加。
非常感谢。
使用本主题编写脚本是否可以仅使用 JavaScript 将数据写入文件? 这是一个简单的数组/对象迭代......
const json = '[{"name":"File","artist":"Andrew","attributes":[{"trait_type":"Background","value":"Black"},{"trait_type":"Base","value":"White"},{"trait_type":"Eye Type","value":"Eye"},{"trait_type":"Ear Type","value":"Ear"},{"trait_type":"Tail Type","value":"Tail"},{"trait_type":"Headwear","value":"Hat"},{"trait_type":"Mouth Accessories","value":"Cigarette"},{"trait_type":"Eye Accessories","value":"Mask"},{"trait_type":"Ear Accessories","value":"Headphones"},{"trait_type":"Details","value":"Headband"}]},{"name":"File2","artist":"Andrew","attributes":[{"trait_type":"Background","value":"White"},{"trait_type":"Base","value":"Black"},{"trait_type":"Eye Type","value":"Eye"},{"trait_type":"Ear Type","value":"Ear"},{"trait_type":"Tail Type","value":"Tail"},{"trait_type":"Headwear","value":"Hat"},{"trait_type":"Mouth Accessories","value":"Cigarette"},{"trait_type":"Eye Accessories","value":"Mask"},{"trait_type":"Ear Accessories","value":"Headphones"},{"trait_type":"Details","value":"Headband"}]}]'; const result = JSON.parse(json).map((parent, i) => { const val = parent.attributes.reduce((prev, curr) => ({...prev, [curr.trait_type]: curr.value}), {}); val.tokenId = i; return val; }) console.log(JSON.stringify(result))
const dat = [ {"name": "File", "artist": "Andrew", "attributes": [{"trait_type": "Background", "value": "Black"}, {"trait_type": "Base", "value": "White"}, {"trait_type": "Eye Type", "value": "Eye"}, {"trait_type": "Ear Type", "value": "Ear"}, {"trait_type": "Tail Type", "value": "Tail"}, {"trait_type": "Headwear", "value": "Hat"}, {"trait_type": "Mouth Accessories", "value": "Cigarette"}, {"trait_type": "Eye Accessories", "value": "Mask"}, {"trait_type": "Ear Accessories", "value": "Headphones"}, {"trait_type": "Details", "value": "Headband"}], }, {"name": "File2", "artist": "Andrew", "attributes": [{"trait_type": "Background", "value": "White"}, {"trait_type": "Base", "value": "Black"}, {"trait_type": "Eye Type", "value": "Eye"}, {"trait_type": "Ear Type", "value": "Ear"}, {"trait_type": "Tail Type", "value": "Tail"}, {"trait_type": "Headwear", "value": "Hat"}, {"trait_type": "Mouth Accessories", "value": "Cigarette"}, {"trait_type": "Eye Accessories", "value": "Mask"}, {"trait_type": "Ear Accessories", "value": "Headphones"}, {"trait_type": "Details", "value": "Headband"}] } ] const res = [] dat.forEach(d => { let obj = {} d.attributes.forEach(m => { obj[m['trait_type']] = m['value'] }) res.push(obj) }) console.log(res)
请记住,JSON 代表 JavaScript Object 表示法。 这意味着任何有效的 JSON 都是 JavaScript object 的字符串化(或序列化)版本。 这意味着我们可以直接从 JSON 字符串中简单地创建一个 in memory object ,如下所示:(限制示例以使其保持较小)
let origJson = {
"name": "File",
"artist": "Andrew",
"attributes":
[
{
"trait_type": "Background",
"value": "Black"
}
]
}
请注意,您需要将第一个作为这些数组的数组,因此您确实需要将第一个 JSON 包装在 [ ] 的外部集合中,这样您就有一个可以迭代的数组。
像这样...
let origJson = [{
"name": "File",
"artist": "Andrew",
"attributes":
[
{
"trait_type": "Background",
"value": "Black"
}
]
},
{
//second object here...
},
{
// ... more objects
},
]
完成后,您需要一个代表您的第二个 object 的 class - 您要映射到的那个。 您需要完成 object 以确保可以初始化每个属性——这对我来说输入太多了。 另请注意,您有一些带有空格的属性名称,并且我已删除了这些空格。 空格不适用于属性名称。 这个 NewObject class 只是您的第二个 JSON 示例的表示。
class NewObject
{
constructor(Background, Base, EyeType, EarType, TailType,
Headwear, MouthAccessories, EyeAccessories, EarAccessories,
Details, tokenId)
{
this.Background =Background;
this.Base = Base;
this.EyeType = ...
}
}
一旦你有了它,你现在可以遍历第一个 object 创建 NewObject 的新实例。 类似于以下内容。
// set up a new array of NewObjects
let allNewObjects = [];
origJson.forEach((item) => {
allNewObjects.push (new NewObject(item.attributes[0].value, item.attributes[1].value, ...));
console.log(item.attributes[0].value, item.attributes[1].value);
});
因为我建议将origJson
包装在外部 [ ] 中,这意味着加载的变量origJson
成为原始对象的数组。
JavaScript arrays 有一个 .forEach() 方法,它将为数组中的每个项目调用 function ——将数组中的每个项目作为参数传递。
在我的示例中,我实现了一个箭头 function,它有两个语句:
这是一个完整的工作示例:
// define (minimal) target class class NewObject { constructor(Background, Base) { this.Background =Background; this.Base = Base; } } // load up your JSON into an array of objects let origJson = [{ "name": "File", "artist": "Andrew", "attributes": [ { "trait_type": "Background", "value": "Black" },{ "trait_type": "Base", "value": "White" }, ] }] // init array to hold all new objects let allNewObjects = []; // iterate over each original object and map to new origJson.forEach((item) => { allNewObjects.push (new NewObject(item.attributes[0].value, item.attributes[1].value)); console.log("attr 0: " + item.attributes[0].value, "attr 1: " + item.attributes[1].value); });
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.