繁体   English   中英

如何从 json 文件中提取一些数据

[英]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,它有两个语句:

  1. 映射到新的 object
  2. 输出到控制台。

这是一个完整的工作示例:

 // 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM