Search code examples
pythonjsondictionarykey

Python cannot find key in a json


I have the following json in a text file:

{
"defaultSymbol" : {
          "type" : "CIMSymbolReference",
          "symbol" : {
            "type" : "CIMPointSymbol",
            "symbolLayers" : [
              {
                "type" : "CIMVectorMarker",
                "enable" : true,
                "anchorPointUnits" : "Relative",
                "dominantSizeAxis3D" : "Z",
                "size" : 4,
                "billboardMode3D" : "FaceNearPlane",
                "frame" : {
                  "xmin" : -2,
                  "ymin" : -2,
                  "xmax" : 2,
                  "ymax" : 2
                },
                "markerGraphics" : [
                  {
                    "type" : "CIMMarkerGraphic",
                    "geometry" : {
                      "curveRings" : [
                        [
                          [
                            1.2246467991473532e-16,
                            2
                          ],
                          {
                            "a" : [
                              [
                                1.2246467991473532e-16,
                                2
                              ],
                              [
                                0,
                                0
                              ],
                              0,
                              1
                            ]
                          }
                        ]
                      ]
                    },
                    "symbol" : {
                      "type" : "CIMPolygonSymbol",
                      "symbolLayers" : [
                        {
                          "type" : "CIMSolidStroke",
                          "enable" : true,
                          "capStyle" : "Round",
                          "joinStyle" : "Round",
                          "lineStyle3D" : "Strip",
                          "miterLimit" : 10,
                          "width" : 1,
                          "color" : {
                            "type" : "CIMRGBColor",
                            "values" : [
                              0,
                              0,
                              0,
                              100
                            ]
                          }
                        },
                        {
                          "type" : "CIMSolidFill",
                          "enable" : true,
                          "color" : {
                            "type" : "CIMRGBColor",
                            "values" : [
                              0,
                              3,
                              173,
                              100
                            ]
                          }
                        }
                      ]
                    }
                  }
                ],
                "respectFrame" : true
              }
            ],
            "haloSize" : 1,
            "scaleX" : 1,
            "angleAlignment" : "Map"
          }
        }
}

I also have the following python code to print each key value pair recursively:

def recursive_items(dictionary):
    for key, value in dictionary.items():
        if type(value) is dict:
            print("value is dict: " +str(type(value)))
            yield (key, value)
            yield from recursive_items(value)
        else:
            print("value is not dict: " +str(type(value)))
            yield (key, value)

f = open('TestJsonMultipleSymbols.txt')

# returns JSON object as
# a dictionary
data = json.load(f)

for key, value in recursive_items(data):
    print("Key: " + str(key), "Value: " + str(value))
    print("Next")
print("done")

This prints all the keys and shows 'symbol' as a key which I looking to find and print the value of. However when I search for the key 'symbol' by modifying the code it returns nothing. What am I missing here? Here is the modified code:

def recursive_items(dictionary):
    for key, value in dictionary.items():
        search_key = 'symbol'
        if search_key in dictionary: 
            if type(value) is dict:
                print("value is dict: " +str(type(value)))
                yield (key, value)
                yield from recursive_items(value)
            else:
                print("value is not dict: " +str(type(value)))
                yield (key, value)

Solution

  • Well simply the check if search_key in dictionary is not recursive. On your very first call, it will check whether symbol is a key in the outermost dictionary. The top-level.

    Now, symbol isn't a key in that dict, so the function just exits without doing anything.