How do I test for items with nbt in 1.16.4 using execute command [duplicate]

I am making a Minecraft Mini Game adventure map, and one of the levels has a /setblock command, I am using the command in a way to spawn an item in a chest (Wooden Button) I need the wooden button to have CanPlaceOn tag so it can be placed on a log.

I have tried this command:

setblock 294 5 -1251 minecraft:chest 0 replace {Items:[{Count:1,Slot:0,id:minecraft:wooden_button,CanPlaceOn:[log]}]}`

Solution 1:

The CanPlaceOn list and all other item data is inside the tag compound tag:

{
  Items:[ 
    {
      id: "minecraft:wooden_button",
      Count: 1b,
      Slot: 0b,
      tag:{
        CanPlaceOn:[
          "minecraft:log"
        ]
      }
    }
  ]
}

Example command for 1.12−:

/setblock 294 5 -1251 minecraft:chest 0 replace {Items:[{Count:1b,Slot:0b,id:"minecraft:wooden_button",tag:{CanPlaceOn:["log"]}}]}

Example command for 1.13+:

/setblock 294 5 -1251 minecraft:chest{Items:[{Count:1b,Slot:0b,id:"minecraft:wooden_button",tag:{CanPlaceOn:["minecraft:log"]}}]}

Item NBT structure can be found on this wiki page.

Common mistakes include:

  • forgetting tag:
    {
      id: "minecraft:wooden_button",
      Count: 1b,
      CanPlaceOn: [
        "minecraft:log"
      ]
    }
    
  • attempting to put it inside the item ID:
    {
      id: "minecraft:wooden_button{CanPlaceOn:['minecraft:log']}",
      Count: 1b
    }