копирование данных из json ответа [Python] - PullRequest
0 голосов
/ 14 июля 2020

У меня есть сценарий, в котором я пытаюсь извлечь данные из ответа json, который получается из запроса GET, а затем перестраиваю данные json, изменяя некоторые значения, а затем отправляя запрос PUT в то же время после восстановления json данные (т.е. после изменения idter значения) ниже - это целевой json ответ.

target_json = {
  "name": "toggapp",
  "ts": [
    1234,
    3456
  ],
  "gs": [
    {
      "id": 4491,
      "con": "mno"
    },
    {
      "id": 4494,
      "con": "hkl"
    }
  ],
  "idter": 500,
  "datapart": false
}

из приведенного выше json Я пытаюсь изменить значение idter на мое пользовательское значение и снова перестроите его в данные json и опубликуйте новые данные json. Вот что я пробовал:

headers = {'Authorization': 'bearer ' + auth_token, 'Content-Type':'application/json', 'Accept':'application/json'}
tesstid =[7865, 7536, 7789]
requiredbdy = []
for key in testid:
    get_metadata_targetjson= requests.get('https://myapp.com/%s' %key, headers = headers)
    metadata=get_metadata_target.json()
    for key1 in metadata:
        requiredbdy.append(
                {
                        "metadata" : [{
                        "name": key1['name'],
                        "ts": key1['ts'],
                      "gs": key1[gs],
                      "idter": 100,  #custom value which I want to change
                     "datapart": false
                     } ]
                    }
                  )
        send_metadata_newjson= requests.put('https://myapp.com/%s' %key, headers = headers data = requiredbdy)
        print(send_metadata_newjson.status_code)

Подходит ли этот подход или как мне действовать, чтобы достичь этого сценария.

Ответы [ 2 ]

2 голосов
/ 14 июля 2020

Вы можете использовать для этого встроенный модуль json, например,

import json

my_json = """
{
  "name": "toggapp",
  "ts": [
    1234,
    3456
  ],
  "gs": [
    {
      "id": 4491,
      "con": "mno"
    },
    {
      "id": 4494,
      "con": "hkl"
    }
  ],
  "idter": 500,
  "datapart": false
}
"""

json_obj = json.loads(my_json)
json_obj['idter'] = 600
print(json.dumps(json_obj))

Печать

{"name": "toggapp", "ts": [1234, 3456], "gs": [{"id": 4491, "con": "mno"}, {"id": 4494, "con": "hkl"}], "idter": 600, "datapart": false}
0 голосов
/ 14 июля 2020

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

from RecursiveSearch import Retriever

def alter_data(json_data, key, original, newval):
    '''
    Alter *all* values of said keys
    '''
    retr = Retriever(json_data)
    for item_no, item in enumerate(retr.__track__(key)): # i.e. all 'value'
        # Pick parent objects with a last element False in the __track__() result,
        # indicating that `key` is either a dict key or a set element
        if not item[-1]: 
            parent = retr.get_parent(key, item_no)
            try:
                if parent[key] == original:
                    parent[key] = newval
            except TypeError:
                # It's a set, this is not the key you're looking for
                pass

if __name__ == '__main__':
    alter_data(notification, key='value', 
               original = '********** THIS SHOULD BE UPDATED **********',
               newval = '*UPDATED*')
...