【问题标题】:JSON splitting down two different pathsJSON 拆分两条不同的路径
【发布时间】:2018-02-06 16:35:43
【问题描述】:

大家好,

我正在寻找创建一个 JSON 脚本,该脚本将允许对象获取值或继续沿数据路径前进

例如:

{
  "A" : {
    "B" : "123"
  }
}

在上面的例子中,如果我得到 A.B 的值,我得到的结果是 123。但是我也希望 A 有自己的值,例如“XYZ”。

所以我们说,什么是 A?它将返回“XYZ”,我还说,什么是 A.B,它将返回“123”

我希望这是有道理的,JSON 似乎遵循单一路径,但我希望能够遵循路径并向每个节点分配值。它就像节点有一个值,但它也有孩子和父母。

非常感谢任何有关理论的帮助

【问题讨论】:

  • 你问的是不可能的。 JSON 是基于键:值的。 A 的值是具有B 唯一属性的对象。您必须在 B 中添加另一个名为 Value 的属性,然后您可以调用 A.Value

标签: javascript c# json


【解决方案1】:

您可以使用reduce() 方法创建自定义函数,以便能够将嵌套键作为字符串传递。

const data = {"A": {"B": "123"}}

const getPath = (path, obj) => {
  return path.split('.').reduce(function(r, e, i, arr) {
    return r[e] || (arr[i + 1] ? {} : undefined)
  }, obj)
}

console.log(getPath('A.B', data))
console.log(getPath('A', data))
console.log(getPath('A.C', data))

如果您想始终返回路径中最后找到的值,您可以改用它。

const data = {
  "A": {
    "B": "123",
    "C": {"D": 2}
  }
}

const getPath = (path, obj) => {
  return path.split('.').reduce((r, e) => (r[e] || r ), obj)
}

console.log(getPath('A.B', data))
console.log(getPath('A.C.F.G', data))
console.log(getPath('A.B.Q', data))

【讨论】:

  • 对不起,但这不是我想要的,它返回完整的 json 而不是它所持有的值。我有一种感觉,我想要的东西是不可能的。
【解决方案2】:

您不能为一个对象属性分配 2 个不同的值。但是,您可以这样做:

{
  "A" : {
    "B" : "123",
    "value" : "XYZ"
  }
}

引用A.value 将返回XYZA.B 将返回123

编辑:

如果您将A 设为返回所需值的函数,则可以将属性分配给A。但这可能是一个不好的做法:

let A = function () {
  return 'XYZ';
}

A.B = '123';

let obj = {
  A
};

console.log(A()); // XYZ
console.log(A.B); // 123

【讨论】:

  • 嗯,我有点喜欢你用 A.Value 去哪里。如果我可以修改对象调用的返回类型,那么我可以轻松解决这个问题。谢谢
【解决方案3】:

JSON 代表JavaScript Object Notation,这意味着 JSON 代表一个对象。一个对象的每个属性可能只有一个值。在您的情况下,如下所示:

var a = { "A": { "B": "123"}

这表示像{ A: { B: 123} 这样的对象,这意味着:

console.log(a.A) // {B: 123}
console.log(a.A.B) // 123

所以你想要做的事情是不可能的。

https://www.w3schools.com/js/js_json_intro.asp

【讨论】:

  • 谢谢,我感觉不是。
  • 如果它解决了您的问题,请用绿色勾标记答案;)祝您有美好的一天
【解决方案4】:

我不确定我是否理解您的问题,但似乎应该在请求之前或响应之前找出您正在寻找的 JSON 字符串的逻辑。返回多个逻辑路径似乎不是一个好主意。

【讨论】:

  • 我找到了一个解决方案,但我同意它有点混乱。感谢您的意见
猜你喜欢
  • 1970-01-01
  • 2020-05-23
  • 2021-07-26
  • 2016-05-23
  • 2016-04-02
  • 1970-01-01
  • 2011-05-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多