【问题标题】:How to extract some data from a json file [closed]如何从json文件中提取一些数据[关闭]
【发布时间】:2022-01-02 14:45:41
【问题描述】:

我想从一个 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 nft


    【解决方案1】:

    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))

    【讨论】:

    • 不。我必须从第一个文件中获取数据并创建一个新文件,如第二个示例所示。
    • @Andrew 更新输入和输出字符串的答案,而不是对象。数据被正确处理。如果您需要代码来读取文件,您可以在this 等其他问题中找到它,因为没有关于它是本地文件还是请求的网络的信息。有什么我在问题中遗漏的吗?
    【解决方案2】:

    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)

    【讨论】:

      【解决方案3】:

      请记住,JSON 代表 JavaScript 对象表示法。 这意味着任何有效的 JSON 都是 JavaScript 对象的字符串化(或序列化)版本。 这意味着我们可以简单地直接从 JSON 字符串创建一个内存对象,如下所示:(限制示例以使其保持较小)

      let origJson = {
          "name": "File",
          "artist": "Andrew",
          "attributes": 
        [
            {
              "trait_type": "Background",
              "value": "Black"
            }
        ]
      }
      

      注意,您需要将第一个 JSON 作为这些数组的数组,因此您确实需要将您的第一个 JSON 包装在 [ ] 的外部集合中,这样您就有一个可以迭代的数组。

      像这样……

      let origJson = [{
          "name": "File",
          "artist": "Andrew",
          "attributes": 
        [
            {
              "trait_type": "Background",
              "value": "Black"
            }
        ]
      },
      {
      //second object here...
      },
      {
      // ... more objects 
      },
      ]
      

      一旦你完成了,你需要一个代表你的第二个对象的类——你要映射到的那个。您需要完成该对象以确保可以初始化每个属性——这对我来说输入太多了。 另请注意,您有一些带有空格的属性名称,并且我已删除了这些空格。空格不适用于属性名称。这个 NewObject 类只是您的第二个 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 be 包裹在外部 [ ] 中,这意味着加载的变量 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);
          });

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-30
        • 1970-01-01
        • 1970-01-01
        • 2021-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多