【问题标题】:RegEx to find json values without quotes正则表达式查找不带引号的 json 值
【发布时间】:2019-01-05 20:58:59
【问题描述】:

我遇到了一个解析器(在本例中为 PowerBI)不采用未引用值的问题。

来自 API 的示例 JSON 文件验证正常,但 PowerBI 没有:

{'requester_id': 361114274894, 'submitter_id': 361114274894, 'assignee_id': 361282665913, 'organization_id': 360009532534, 'group_id': 360000498954, 'name':'John Doe'}

我想查找所有不带引号的值,以便替换它们。

请帮忙。

【问题讨论】:

  • 这不是 JSON,而是 JavaScript。在写文件之前你需要JSON.stringify它。
  • 这是我从 API 获得的输出。当然,这不是完整的输出,它是一个子集,但未引用的值给了我一个问题。
  • 它只是数字,匹配数字并将它们替换为引号?
  • 如果 api 正在输出无效 JSON 的单引号属性键。如果属性键是双引号的并且数字没有被引用,那是完全有效的。除此之外,您还没有提供正确的问题描述,这听起来像 XY problem
  • 为什么 Power BI 接受它?同样,它不是 JSON。问题是 API 没有返回有效的 JSON,它只是返回 JavaScript。字符串修饰不是一个好的修复方法,要么修复上游 API,要么将其显式字符串化为层中的有效 JSON。使用内置功能,它将为您处理所有边缘情况。

标签: javascript json regex


【解决方案1】:

您似乎想将您的 int 值转换为字符串。

var json = {'requester_id': 361114274894, 'submitter_id': 361114274894, 'assignee_id': 361282665913, 'organization_id': 360009532534, 'group_id': 360000498954, 'name':'John Doe'}

    Object.keys(json).forEach(i => json[i]=json[i].toString());

    // output
    json
    {
      assignee_id:"361282665913"
      group_id:"360000498954"
      name:"John Doe"
      organization_id:"360009532534"
      requester_id:"361114274894"
      submitter_id:"361114274894"
    }

【讨论】:

    【解决方案2】:

    问题在于在属性名称周围使用单引号而不是双引号。

    let correctedInput = input.replace(/'/g, '"');
    let parsedInput = JSON.parse(correctedInput);
    

    parsedInput 现在将成为您的 javascript 对象。

    input.replace(/'/g, '"') 将查找并替换所有' 字符,并将它们替换为" 字符。这应该可以正常工作,除非您的任何属性值中都有单引号 - 例如,名称 O'malley 将被错误地解析。

    【讨论】:

      【解决方案3】:

      您可以使用 for in 循环。假设所有非字符串项目都是数字,以下将起作用。

      const obj = {
        a: 123,
        b: "234234",
        c: 09,
      };
      
      console.log(obj);
      
      for (key in obj) {
        obj[key] = obj[key] + "";
      }
      
      console.log(obj);

      如果目标是收集所有具有非字符串值的键而不是替换它们,则可以将它们保存到数组中并稍后对其进行操作:

      const obj = {
        a: 123,
        b: "234234",
        c: 09,
      };
      const arr = [];
      
      for (key in obj) {
        if (typeof obj[key] !== "string") {
          arr.push(key);
        }
      }
      
      console.log(arr);

      【讨论】:

        【解决方案4】:

        您可以在 Java 中执行如下正则表达式模式匹配

        String rtype="^\"|\"$";

        字符串值 = ((JSONObject) nameOfObject).get("key").toString().matches(rtype);

        ((JSONObject) nameOfObject).get("key").toString().replaceAll(rtype);

        【讨论】:

        • 他说的不是Java,而是JavaScript。它们是完全不同的两件事。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-12-19
        • 1970-01-01
        • 2015-03-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多