Как изменить вложенное значение в файле JSON? - PullRequest
2 голосов
/ 09 июля 2020

Я пытаюсь изменить указанное c вложенное значение («pH»), если «ID» совпадает, но меняет только первое, а не то, которое я намеревался.

Кто я пытается сделать:

{
    "type": "FeatureCollection",
    "name": "test",
    "crs": {
        "type": "name",
        "properties": {
            "name": "urn:ogc:def:crs:EPSG::3059"
        }
    },
    "features": [{
            "type": "Feature",
            "properties": {
                "ID": 1,
                "pH": 3.5,
                "P": 2.8,
                "K": 11.0,
                "Mg": 15.8
            },
            "geometry": {
                "type": "Polygon",
                "coordinates": [
                    [

                    ]
                ]
            }
        }, {
            "type": "Feature",
            "properties": {
                "ID": 2,
                "pH": 3,
                "P": 2.5,
                "K": 11.1,
                "Mg": 15.8
            },
            "geometry": {
                "type": "Polygon",
                "coordinates": [
                    [

                    ]
                ]
            }
        }
    ]
}

Но он изменяет «значение pH, где« ID »равно 1, и значение« pH », где« ID »: 2 остается прежним.

Вот мой код:

import json

with open('filepath', 'r+') as f:
    data = json.load(f)

    for feature in data['features']:

        print(feature['properties'])
        if feature['properties']["ID"] == 2:

            data['features'][0]['properties']["pH"]=10
            f.seek(0)
            json.dump(data, f, indent=4)
            f.truncate()

Ответы [ 2 ]

2 голосов
/ 09 июля 2020
  • Вам нужно выполнить перечисление во время итерации по data['features'], чтобы вы могли вернуть правильное значение
    • data['features'][0] присваивается только ph в индексе списка 0.
with open('filepath', 'r+') as f:
    data = json.load(f)

    for i, feature in enumerate(data['features']):  # enumerate while iterating

        print(feature['properties'])
        if feature['properties']["ID"] == 2:

            data['features'][i]['properties']["pH"]=10  # assign back to the correct index location
            f.seek(0)
            json.dump(data, f)
            f.truncate()
1 голос
/ 09 июля 2020
data['features'][0]

индексируется по [0] и, следовательно, изменяет первую «функцию» в data["features"]. Вы хотите изменить его на основе индекса, который оценивается как True в вашем состоянии feature['properties']["ID"] == 2.

Попробуйте

for index, feature in enumerate(data['features']):
    ...
    if feature['properties']["ID"] == 2:
        data['features'][index]['properties']["pH"] = 10
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...