如何从 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”,它逐渐增加。

非常感谢。

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 Notation。 这意味着任何有效的 JSON 都是 JavaScript 对象的字符串化(或序列化)版本。 这意味着我们可以直接从 JSON 字符串中简单地创建一个内存对象,如下所示:(有限的例子以保持它的小)

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 
},
]

完成后,您需要一个 class 代表您的第二个对象——您要映射到的对象。您需要完成该对象以确保每个 属性 都可以被初始化——这对我来说输入太多了。 另请注意,您有一些 属性 名称包含空格,我已删除这些空格。空格不适用于 属性 个名称。此 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 = ...
    }
}

完成后,您现在可以遍历创建 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 数组有一个 .forEach() 方法,该方法将为数组中的每个项目调用一个函数——将数组中的每个项目作为参数传递。

在我的示例中,我实现了一个包含两个语句的箭头函数:

  1. 映射到新对象
  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);
    });