Compare array with Json
Your identifiers could be altered to make things clearer. What you're calling product_data is just a list of names, so perhaps product_names would be better. Then it follows that product should become product_name, as for product_name in product_names: makes perfect sense. And you should only call things x where that's the convention of the domain (e.g. mathematics).



One obvious code simplification is that you can iterate over a dictionary's keys and values simultaneously:

for product_no, product in json_data.items():
    for product_name in product_names:
        ...


This way your comparisons lower down are neater:

if product_name.lower() in product['name'].lower():




Rather than product_name.lower() every time you compare to it, lowercase everything once:

product_names = [name for name in product_strings.lower().split(',')]
                                               # ^ e.g. here


In this case you don't need it at all, as product_strings is already lowercase!



You can do multiple comparisons in one (logical) line, too, reducing duplication:

if (product_name in product['name'].lower() 
        or product_name in product['des'].lower()):
    print (product, product_spec['name'])