【问题标题】:Best way to process non-ideal JSON?处理非理想 JSON 的最佳方式?
【发布时间】:2018-09-20 17:06:04
【问题描述】:

我目前正在尝试读取.vdf 文件,即Valve's proprietary "KeyValue" file format。我找到了一个简单的VDF to JSON converter,它似乎很适合我的需要,但是 JSON 输出的格式不太理想。例如,对于以下 VDF 输入:

"LibraryFolders"
{
    "TimeNextStatsReport"       "1523464730"
    "ContentStatsID"        "8627456721266182211"
    "1"     "G:\\Steam"
}

我得到以下 JSON 输出:

{
    "LibraryFolders": {
        "1": "G:\\\\Steam",
        "TimeNextStatsReport": "1523464730",
        "ContentStatsID": "8627456721266182211"
    }
}

我需要一种方法来获取 LibraryFolders 对象中具有严格数字名称(1、2、3...)的所有变量,并将它们放入数组中,去除 TimeNextStatsReportContentStatsID 字段.如何做到这一点?

我认为最容易使用的输出如下:

{
    "LibraryFolders": [
        "G:\\\\Steam",
        ...
    ]
}

省略号显然表示任何以数字命名的字段的延续。

【问题讨论】:

  • 所以你想要:{ "LibraryFolders": ["G:\\\Steam", "1523464730", "8627456721266182211"] }
  • @MarcosCasagrande 是的,但只有数字命名的字段(例如"1")。我实际上不需要 TimeNextStatsReportContentStatsID 字段,只需要包含实际文件夹路径的字段。
  • 显示你想要的确切输出,我会告诉你怎么做。
  • @MarcosCasagrande 查看我的编辑。
  • @user2864740 注意:)

标签: javascript json


【解决方案1】:

我会给你另一个单循环示例:

let object = {
        "LibraryFolders": {
            "1": "G:\\\\Steam",
            "TimeNextStatsReport": "1523464730",
            "ContentStatsID": "8627456721266182211",
            "2": "kasjfkljaklsjf",
            "1241212213": "alskdjlkasjkladsjasj",
            "123jkjk123123": "aksjdljasdkljklsad",
        }
    };
    object['LibraryFolders'] = Object.keys(object['LibraryFolders']).reduce((acc, current) => (/^\d+$/.test(current) && acc.push(object['LibraryFolders'][current]), acc), []);
    console.log(object);

【讨论】:

  • 当然,你可以运行它并检查它是否需要
  • 你没有,在edited我们可以看到你所有的变化,所以,你的第一个版本根本没有经过测试,所以你应该说:'我的错,修复了!'而不是“当然”...
  • 我更新了第一个版本,然后看到了你的第一个comnent和answere。反正你很有趣
【解决方案2】:

这里有一个示例代码,可以做你想做的事(我认为)

//lets take your example object.
let LibraryFolders= {
    "1": "G:\\\\Steam",
    "TimeNextStatsReport": "1523464730",
    "ContentStatsID": "8627456721266182211",
    "2": "kasjfkljaklsjf",
    "1241212213": "alskdjlkasjkladsjasj",
    "123jkjk123123": "aksjdljasdkljklsad",
  };

//we define a function that will do the magic  
function getArrayVersion(obj){
  return Object.keys(obj).filter(key => {
    if (!isNaN(key)) {
      return key
      // return parseInt(key); //in case that you need the INT conversion.
    }
  });
}

//we call the magic
console.log(getArrayVersion(LibraryFolders))

【讨论】:

  • 他想要的是价值,而不是关键:)
  • @MarcosCasagrande 感谢您告诉我这一点,很好。在这种情况下,他只需要将 return 更改为:return obj[key]
  • 还是不行,过滤器不会改变值,它会保持不变。
【解决方案3】:

解析 JSON 后,我们可以使用Object.entriesArray.filterArray.map 的组合来实现所需的格式。

let object = {
    "LibraryFolders": {
        "1": "G:\\\\Steam",
        "TimeNextStatsReport": "1523464730",
        "ContentStatsID": "8627456721266182211",
        "2": "Other Numeric key",
    }
}

object.LibraryFolders = Object.entries(object.LibraryFolders)
  .filter(([key, value]) => Number(key)) // Filter non numeric keys
  .map(([, value]) => value); // We only keep the value, not the key


console.log(object);

【讨论】:

  • 非常感谢!我开始怀疑我的理智有多困扰我。
  • @IsaacCorbrey 更短一点的替代品object.LibraryFolders = Object.assign([], object.LibraryFolders).slice(1)
  • @Slai 我必须说,我印象深刻,从没想过那个。
  • @MarcosCasagrande @Slai 非常感谢你们!现在我只需要弄清楚为什么 Object.entries()Object.assign() 都不能使用 TypeScript。
  • @IsaacCorbrey 看看这里:stackoverflow.com/questions/39741428/…
猜你喜欢
  • 2013-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-15
相关资源
最近更新 更多