Возврат функции ламба JSON - PullRequest
0 голосов
/ 06 марта 2019

Я хочу знать, как бы я написал лямбда-функцию для поиска всех значений с ключом 'title' в json.Причина этого в том, что я пытаюсь создать легенду с этими элементами.Я хотел бы сделать это как можно более общим.В будущем у меня может появиться больше элементов title, которые мне нужно будет собрать в List для манипулирования ими в функциях отображения ArcPy.

Вот данные json, с которыми я работаю.

{
    "mapOptions": {
        "showAttribution": true,
        "extent": {
            "xmin": -13208269.297921617,
            "ymin": 4049185.0103628845,
            "xmax": -13204562.102049686,
            "ymax": 4052218.6049230327,
            "spatialReference": {
                "wkid": 102100,
                "latestWkid": 3857
            }
        },
        "spatialReference": {
            "wkid": 102100
        },
        "scale": 18055.954822
    },
    "operationalLayers": [{
            "id": "defaultBasemap",
            "title": "Topographic",
            "opacity": 1,
            "minScale": 0,
            "maxScale": 0,
            "url": "https://services.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer"
        }, {
            "id":

 "WV_Base_Route_Webmap_022019_Comments_RELATE_ArcGIS_ONLINE_2110",
                "title": "Comments",
                "opacity": 1,
                "minScale": 0,
                "maxScale": 0,
                "layerDefinition": {
                    "drawingInfo": {
                        "renderer": {
                            "type": "simple",
                            "label": "",
                            "description": "",
                            "symbol": {
                                "color": [153, 74, 0, 255],
                                "size": 4,
                                "angle": 0,
                                "xoffset": 0,
                                "yoffset": 0,
                                "type": "esriSMS",
                                "style": "esriSMSCircle",
                                "outline": {
                                    "color": [0, 0, 0, 255],
                                    "width": 1,
                                    "type": "esriSLS",
                                    "style": "esriSLSSolid"
                                }
                            }
                        }
                    }
                },
                "token": "aOO0npo0L2ShYruhcLkSPQjofYj8XM0WKVE_GNbtKE-WgC4nB_t0jkuWGesN1bxz9VCum0DuVwEcePax4r7Tj5PlHFQAjqbLdFx2k_YqQrN6q9mjybGG00TLm-G_4j6NVfLxxmIXpGSH5vUM5s2L_F9vIW5VP2KsIzgOlGvZSzUbauzPjd5eMaobheEM0g3BZ4FYluEGcEZ1bFL4GnRkPJgQAo4Rj64uEygJJWrlXb-QmUKiA5Ibq5fHglxzv-7I7AY61cLO0VMF_23tHybBcnSi_zsFYkhKImLWOzrmTuA.",
                "url": "https://services1.arcgis.com/X1hcdGx5Fxqn4d0j/arcgis/rest/services/WV_Base_Route_Webmap_022019_Comments_RELATE_ArcGIS_ONLINE/FeatureServer/1"
            }, {
                "id": "WV_Base_Route_Webmap_022019_Comments_RELATE_ArcGIS_ONLINE_1115",
                "title": "Route_Title",
                "opacity": 1,
                "minScale": 0,
                "maxScale": 0,
                "layerDefinition": {
                    "drawingInfo": {
                        "renderer": {
                            "type": "simple",
                            "label": "",
                            "description": "",
                            "symbol": {
                                "color": [156, 0, 132, 255],
                                "width": 1,
                                "type": "esriSLS",
                                "style": "esriSLSSolid"
                            }
                        }
                    },
                    "definitionExpression": "((UPPER(Map_Title) = 'FRI-AA-07'))"
                },
                "token": "aOO0npo0L2ShYruhcLkSPQjofYj8XM0WKVE_GNbtKE-WgC4nB_t0jkuWGesN1bxz9VCum0DuVwEcePax4r7Tj5PlHFQAjqbLdFx2k_YqQrN6q9mjybGG00TLm-G_4j6NVfLxxmIXpGSH5vUM5s2L_F9vIW5VP2KsIzgOlGvZSzUbauzPjd5eMaobheEM0g3BZ4FYluEGcEZ1bFL4GnRkPJgQAo4Rj64uEygJJWrlXb-QmUKiA5Ibq5fHglxzv-7I7AY61cLO0VMF_23tHybBcnSi_zsFYkhKImLWOzrmTuA.",
                "url": "https://services1.arcgis.com/X1hcdGx5Fxqn4d0j/arcgis/rest/services/WV_Base_Route_Webmap_022019_Comments_RELATE_ArcGIS_ONLINE/FeatureServer/0"
            }
        ],
        "exportOptions": {
            "outputSize": [670, 500],
            "dpi": 96
        },
        "layoutOptions": {
            "titleText": "ArcGIS Web Map",
            "authorText": "Web AppBuilder for ArcGIS",
            "copyrightText": "County of Los Angeles, Bureau of Land Management, Esri, HERE, Garmin, INCREMENT P, USGS, METI/NASA, EPA, USDA | VENOM | ",
            "customTextElements": [{
                    "Date": "3/5/2019, 2:37:09 PM"
                }
            ],
            "scaleBarOptions": {
                "metricUnit": "esriKilometers",
                "metricLabel": "km",
                "nonMetricUnit": "esriMiles",
                "nonMetricLabel": "mi"
            },
            "legendOptions": {
                "operationalLayers": [{
                        "id": "WV_Base_Route_Webmap_022019_Comments_RELATE_ArcGIS_ONLINE_2110"
                    }, {
                        "id": "WV_Base_Route_Webmap_022019_Comments_RELATE_ArcGIS_ONLINE_1115"
                    }
                ]
            }
        }
    }

результат ['Topographic', 'Comments', 'Route_Title']

1 Ответ

1 голос
/ 06 марта 2019

Обойдя все узлы в JSON, вы можете получить результат. Ваш JSON является вложенным, поэтому вы должны пройти его рекурсивно. Потому что lambda создает функцию без имени, поэтому трудно рекурсивно обходить вложенный json.

def find_value(dic):
    if isinstance(dic, dict):
        result = []
        for k, v in dic.items():
            if k == 'title':
                result.append(v)
            else:
                result.extend(find_value(v))
        return result
    else:
        return [dic]

a = {
    "dd": {
        "title": 23
    }, 
    "title": {
        "a": 115
    }
}
print find_value(a)   # output:[23, {'a': 115}]
...