This code it fairly simple.
"format_version" defines what format the file uses. We'll be using 1.10;
"identifier" in "description" is used in blocks, recipes and entities too. It will be used to define your item. [For example, you can use /give with the identifier like this: /give @s tut:gem).The part of the identifier is your pack's namespace. It's best to use the same namespace throughout your pack. It can be anything you like(e.g "kf:", "jdot:", "ve:", "kai:") providing it isn't too long. A namespace CANNOT be "minecraft:" or "minecon:". The second part of the identifier is the name of the item, entity, recipe or block.
"components" are "qualities" the object always has. We'll look deeper into them when creating a custom entity. Let's break up everything in "components".
"minecraft:hand_equipped" defines whether the item 'equips' in your hand, this controls how the item is displayed on your character. For example, a Wooden Sword is hand equipped, but an Apple isn't.
"minecraft:stacked_by_data" defines whether this item with different aux values will be able to stack. For example, the item "minecraft:dye" with aux value 0, which is an Ink Sack (/give @s dye 1 0), doesn't stack with "minecraft:dye" with aux value 12, which is a Cocoa Bean (/give @s dye 1 12).
"minecraft:foil" defines whether the item will have the enchantment glint on it. An enchanted Shovel has this component set to true, but a disenchanted one to false.
"max_stack_size" is self-explanatory. Set this to 1 for an unstackable item.
"minecraft:max_damage" can be not included, since it's for tools and weapons. It basically defines the item's durability and is rarely used in simple items.