我试图用不同的输入值组合构建一个名为catalogs的对象数组,但不能在同一个对象中设置某些属性.这是当前的进展:

[
  {
    "operation": "shift",
    "spec": {
      "new": {
        "bc_sku_channel": {
          "*": {
            "Partner": null, //ignore if value is Partner 
            "*": {
              "#BC": "catalogs[#3].catalog",
              "@1": "catalogs[#3].channel"
            }
          }
        },
        "bc_sku_partner": {
          "*": {
            "#BC": "catalogs[].catalog", // don't know which index should be here to group these 3 attributes into the same object
            "#Partner": "catalogs[].channel", // tried #3,#2,#1,#4 but doesn't work
            "@": "catalogs[].partner"
          }
        },
        "cc_sku_channel": {
          "*": {
            "Partner": null, //ignore if value is Partner 
            "*": {
              "#CC": "catalogs[#3].catalog",
              "@1": "catalogs[#3].channel"
            }
          }
        }
      }
    }
  }
]

输入:

{
  "new": {
    "bc_sku_partner": [
      "Amazon",
      "Ebay"
    ],
    "bc_sku_channel": [
      "Partner",
      "Online",
      "Store"
    ],
    "cc_sku_channel": [
      "Store"
    ]
  }
}

预期输出:

 {
  "catalogs": [
    {
      "catalog": "BC",
      "channel": "Partner",
      "partner": "Amazon"
    },
    {
      "catalog": "BC",
      "channel": "Partner",
      "partner": "Ebay"
    },
    {
      "catalog": "BC",
      "channel": "Online"
    },
    {
      "catalog": "BC",
      "channel": "Store"
    },
    {
      "catalog": "CC",
      "channel": "Store"
    }
  ]
}

现在我只能构建最后3个对象.

笔记:

如果通道为OnlineStore,则对象不应具有partner属性.

对于每个合作伙伴,通道属性应始终为Partner

推荐答案

此规范生成预期输出

Version which assumes that bc_ and cc_ prefixes are dynamic:

在这个答案的末尾可以找到更简单的版本.

[
  {
    "operation": "shift",
    "spec": {
      "new": {
        "*_sku_partner": {      // 1
          "*": {                // 2
            "*": {              // 3
              "@1": {           // 4
                "$1": "partner__&1__&(4,1).partner",              // 5
                "#Partner": "partner__&1__&(4,1).channel",        // 6
                "$(3,1)": "partner__&1__&(4,1).catalogLowerCase"  // 7
              }
            }
          }
        },
        "*_sku_channel": {
          "*": {
            "Partner": null,        // 8
            "*": {
              "@1": {
                "$1": "channel__&1__&(4,1).channel",
                "$(3,1)": "channel__&1__&(4,1).catalogLowerCase"
              }
            }
          }
        }
      }
    }
  },
  {
    "operation": "shift",            // 9
    "spec": {
      "partner__*": "catalogs[#1]",
      "channel__*": "catalogs[#1]"
    }
  },
  {
    "operation": "modify-default-beta",  // 10
    "spec": {
      "catalogs": {
        "*": {
          "catalog": "=toUpper(@(1,catalogLowerCase))"
        }
      }
    }
  },
  {
    "operation": "shift",  // 11
    "spec": {
      "catalogs": {
        "*": {
          "catalogLowerCase": null,
          "*": "&2[&1].&"
        }
      }
    }
  }
]

我想第一次手术是最棘手的:

{
  "channel__Online__bc" : {
    "catalogLowerCase" : "bc",
    "channel" : "Online"
  }
  // ...
  "partner__Amazon__bc": {
    "catalogLowerCase": "bc",
    "channer": "Partner",
    "partner": "Amazon"
  }
}

发件人:

// ...
"bc_sku_partner": [
  "Amazon",
  "Ebay"
]
// ...

让我们关注为"Amazon"生成的第一个条目:

公元1年.*_sku_partner匹配"bc_sku_partner".您也可以将星号替换为明确的bc值,而不是ad.7中的$(3,1)位置#BC

公元2年.匹配["Amazon", ...]列表的元素.

公元3年.我们现在在亚马逊:D

公元4年.我们走进"亚马逊"并伸手go 拿它(@1).相关单据:@ shift wildcard

公元5年.查看($ wildcard docs)

"$"的语法与"&;"相同通配符,可以读取为,取消引用以获取值,然后将该值用作要输出的数据.

$1上升一级,获取值("Amazon")并将其置于"partner__&1__&(4,1).partner:键下.

上升4级(我们是"bc\U sku\U合作伙伴"),并获取星号匹配的值.参见:& wildcard docs

公元6年.将"Partner"字符串放在"channel"键下("partner": "Amazon"键值旁边).

公元7年.又是$(3,1),但在这里,我们找到了与星号匹配的"bc",并将其放在"catalogLowerCase"键下.

"*_sku_channel"部分非常相似,所以我不打算解释它.

公元9年.第二次换档操作.它的目的是将第一个shift操作生成的字典转换为"catalogs"键下的列表.# wildcard份文件在这里可能有用.

Ad.10和11将"catalogLowerCase": "bc"替换为"catalog": "BC".对于与"Ebay""Online""Store"个条目相关的类似"catalogLowerCase"个字段也是如此.

try 以增量方式应用这些操作,以查看中间结果.我推荐这个网站进行测试:https://jolt-demo.appspot.com/.它也有很多例子.


编辑:

Other way to do it, if the bc_ and cc_ prefixes are not dynamic.

[
  {
    "operation": "shift",
    "spec": {
      "new": {
        "bc_sku_partner": { // 1
          "*": { // 2
            "*": { // 3
              "@1": { // 4
                "$1": "partner__&1__bc.partner", // 5
                "#Partner": "partner__&1__bc.channel", // 6
                "#BC": "partner__&1__bc.catalog" // 7
              }
            }
          }
        },
        "bc_sku_channel": {
          "*": {
            "Partner": null,
            "*": {
              "@1": {
                "$1": "channel__&1__bc.channel",
                "#BC": "channel__&1__bc.catalog"
              }
            }
          }
        },
        "cc_sku_channel": {
          "*": {
            "Partner": null,
            "*": {
              "@1": {
                "$1": "channel__&1__cc.channel",
                "#CC": "channel__&1__cc.catalog"
              }
            }
          }
        }
      }
    }
  },
  {
    "operation": "shift",
    "spec": {
      "partner__*": "catalogs[#1]",
      "channel__*": "catalogs[#1]"
    }
  }
]

Java相关问答推荐

转换为Biggram

我的scala文件失败了Scala.g4 ANTLR语法

Java模式匹配记录

是否保证在事务性块的末尾标记违反约束?

在运行MVN测试时,为什么构建失败,并显示了java.lang.ClassNotFoundException:java.net.http.HttpResponse?

将带有js文件的 bootstrap 程序导入maven项目时出错

Mapstruct不能正确/完全映射属性

无法了解Java线程所消耗的时间

Java17支持哪个MapR版本?

Instancio未在日志(log)中显示测试失败消息

使用SWIG将C++自定义单元类型转换为基本Java类型

Java中HashSet的搜索时间与TreeSet的搜索时间

插入中的JOOQ序列,设置为VS值

在Eclipse中可以使用外部字体吗?

Maven-Dependency-Plugin 3.6.+开始查找在依赖关系:分析目标期间找到的新的使用的未声明依赖关系

活泼的一次判断成语,结果中等

H2数据库仅支持%1个结果集?

Java返回生成器的实现

如何判断元素计数并在流的中间抛出异常?

如何在 WebSphere Application Server 内的托管线程上运行 BatchEE 作业(job)?