【问题标题】:Extract json objects from a list using python [duplicate]使用python从列表中提取json对象[重复]
【发布时间】:2018-07-13 13:54:35
【问题描述】:

我有一个字符串类型的列,其中包含一个嵌套字典对象的元素列表。例如

str = '[{"method":
{"super":0.03,"normal":0.8,"par":0.15,"goal":0.01,"fact":0.04},
"city":["nyc","atlanta"],
"description":"some description",
"content_type":"media"},
{"method":
{"super":0.03,"normal":0.8,"par":0.15,"goal":0.01,"fact":0.04},
"city":["chicago","dallas"],
"description":"some description2",
"content_type":"web"},
{"method":
{"super":0.03,"normal":0.8,"par":0.15,"goal":0.01,"fact":0.04},
"city":["las vegas","buffalo"],
"description":"some description3",
"content_type":"media"}]'

这实际上是 spark 数据框中的一列,它是一个字符串类型。所以我想知道如何将字符串的内容转换为列表,以便我可以使用 json.loads 转换列表中的每个元素。

有什么想法吗?

【问题讨论】:

  • 抛开小语法问题(单引号字符串中的换行符),您所拥有的可以直接传递给json.loads,它会将其解码为 Python dicts 列表。跨度>
  • 这里的最终目标是什么? PySpark 中有 JSON 函数。我想知道这是不是XY problem
  • 确实是XY问题。最终目标是从 pyspark 数据框中检索嵌套的 json 对象。谢谢指出

标签: python json apache-spark spark-dataframe


【解决方案1】:
import json
msg = '''[{"method":
{"super":0.03,"normal":0.8,"par":0.15,"goal":0.01,"fact":0.04},
"city":["nyc","atlanta"],
"description":"some description",
"content_type":"media"},
{"method":
{"super":0.03,"normal":0.8,"par":0.15,"goal":0.01,"fact":0.04},
"city":["chicago","dallas"],
"description":"some description2",
"content_type":"web"},
{"method":
{"super":0.03,"normal":0.8,"par":0.15,"goal":0.01,"fact":0.04},
"city":["las vegas","buffalo"],
"description":"some description3",
"content_type":"media"}]'''
json.loads(msg)[0]



 out:
{'city': ['nyc', 'atlanta'],
 'content_type': 'media',
 'description': 'some description',
 'method': {'fact': 0.04,
  'goal': 0.01,
  'normal': 0.8,
  'par': 0.15,
  'super': 0.03}}

【讨论】:

    【解决方案2】:

    json.loads 应该可以很好地处理这些数据 - 它会返回一个字典列表。

    【讨论】:

      【解决方案3】:

      有几个步骤可以解决这个问题,我希望 json.loads 是您完成后甚至需要的。 如果您按照这些步骤操作,您的字符串将转换为字典列表(并且几乎不需要 json.loads)

      第一步,去掉字符串中的括号“[]” 假设您将字符串设置为变量“value”,请运行以下几行:

      value = value[1:]
      value = value[:-1]
      

      接下来,我们将准备使用 python 的 .split() 函数,该函数将通过您选择的任何字符将任何字符串分隔为列表。 问题是,您的字符串中有两级逗号。一个在列表之间,一个在字典值之间。 因此,在我们拆分行之前,让我们将列表的逗号转换为半色,这样我们的拆分函数就可以在正确的位置吐出字符串。使用此代码:

      value = value.replace('},','};') 
      

      最后,使用此代码将字符串拆分为列表 value = value.split(';')

      让我知道这是否适合你 祝你好运

      【讨论】:

      • 如果您删除字符串中的换行符会有所帮助....
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-02
      • 2019-04-09
      • 2016-03-01
      • 2020-05-15
      • 1970-01-01
      • 1970-01-01
      • 2022-01-05
      相关资源
      最近更新 更多