управление списком json в python

#python #arrays #json #sorting

#python #массивы #json #сортировка

Вопрос:

Быстрый вопрос о работе со списком Json.

У меня есть данные json, которые имеют следующий формат

 [
 "fruits", 
 "apple", 
 "{n    "color": "red",n    "harvest": "ready"n}n",
 "{n    "color": "green",n    "harvest": "not ready"n}n",
 "veggies",
 "spinach" 
 "{n    "color": "green",n    "harvest": "not ready"n}n",
 "{n    "color": "light green",n    "harvest": "not ready"n}n"
]
  

Я хотел перенести любую строку, которая находится перед «{» (пример: яблоко и шпинат), в «Ключ-значение» и добавить статические «ключи», такие как «имя» и «функции», в json, наконец, это будет выглядеть примерно так:

     {
     "fruits":{"name":"apple",
     "features":[
     {
     "color":"red",
     "harvest":"ready"
     }",
     {"color":"green" 
     "harvest":"not ready"
      ]},
     "veggies":{"name":"spinach",
     "features":[
     {
     "color":"green",
     "harvest":"notready"
     },
     {
     "color":"light green",
     "harvest":"not ready"
     ]}
    }
  

Комментарии:

1. Как вы получаете этот JSON? это в файле json? или хранятся в переменной через строку? Я спрашиваю, потому что у вас есть возврат каретки » n».

2. я получаю через строку

3. всегда ли каждый элемент находится в своей собственной строке?

4. да, каждый элемент в отдельной строке. спасибо за проверку

Ответ №1:

Несколько советов, которые подскажут вам, как действовать дальше:

С предоставленным вами списком строк (я думаю, что после этого не хватает одной запятой "spinach" )

 strings = [
    "fruits",
    "apple",
    "{n    "color": "red",n    "harvest": "ready"n}n",
    "{n    "color": "green",n    "harvest": "not ready"n}n",
    "veggies",
    "spinach",
    "{n    "color": "green",n    "harvest": "not ready"n}n",
    "{n    "color": "light green",n    "harvest": "not ready"n}n"
]
  

это

 import json

items = []
for string in strings:
    try:
        items.append(json.loads(string))
    except:
        items.append(string)
  

дает вам ( print(items) ) следующий список:

 ['fruits',
 'apple',
 {'color': 'red', 'harvest': 'ready'},
 {'color': 'green', 'harvest': 'not ready'},
 'veggies',
 'spinach',
 {'color': 'green', 'harvest': 'not ready'},
 {'color': 'light green', 'harvest': 'not ready'}]
  

Теперь это

 results = {}
items = iter(items)
while True:
    try:
        category = next(items)
    except StopIteration:
        break
    
    results[category] = {
        'name': next(items),
        'features': [next(items), next(items)]
    }
  

производит ( print(results) )

 {'fruits': {'features': [{'color': 'red', 'harvest': 'ready'},
                         {'color': 'green', 'harvest': 'not ready'}],
            'name': 'apple'},
 'veggies': {'features': [{'color': 'green', 'harvest': 'not ready'},
                          {'color': 'light green', 'harvest': 'not ready'}],
             'name': 'spinach'}}
  

Пока все хорошо, но я подозреваю, что ваш список строк на самом деле длиннее. Скорее всего, он содержит другие фрукты или овощи, которые должны быть включены в результат. Для этого вам необходимо соответствующим образом настроить структуру программы (включая структуру результатов).