寻找一个DSL来将JSON转换成CSV

2024-06-06 08:48:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要将层次数据(AVRO数据,归结为JSON)转换为表格数据(csv)。由于AVRO有严格的schema,我基本上知道JSON将采用什么形式,但我必须对许多不同的模式进行此操作,因此我正在寻找一种一致的、声明性的方法来表达我需要进行的转换。例如,如果我输入的数据是这样的

{
    "customers": [
        {
            "addresses": [
                {
                    "city": "Los Angeles", 
                    "country": "USA", 
                    "county": null, 
                    "postalCode": "90064", 
                    "stateOrProvince": "California", 
                    "street1": "11832 W. Pico Blvd.", 
                    "street2": "", 
                    "street3": "", 
                    "street4": "", 
                    "tags": [
                        "BILLING"
                    ]
                }
            ], 
            "company": "", 
            "dateCreated": "2009-04-24T11:42:31+00:00", 
            "dateOfBirth": null, 
            "doNotCall": null, 
            "email": {
                "emailAddress": "general@magentocommerce.com"
            }, 
            "emailOptOut": null, 
            "fullName": {
                "firstName": "Test", 
                "lastName": "General", 
                "middleName": "", 
                "prefix": "", 
                "suffix": ""
            }, 
            "gender": null, 
            "id": {
                "Id": "2", 
                "namespace": "1000020016"
            }, 
            "lastModified": "2009-05-08T23:33:06+00:00", 
            "primaryPhone": {
                "number": "866.4.VARIEN", 
                "type": "UNKNOWN"
            }, 
            "sourceIds": null
        }
    ], 
    "totalItemsFound": 3
}

…我可能需要为每个客户输出一行,如下所示:

^{pr2}$

我需要能够表达以下内容:

  1. 以数组形式从给定的键中获取所有值:所有出生日期
  2. 每行重复一个值:totalItemsFound,每行重复
  3. 在来自静态数据的每一行重复一个静态值,我已经知道商家渠道从不改变
  4. 还有一个棘手的问题:任意操纵输入数据以产生所需的输出:
    • 将客户的id转换为命名空间id
    • 将null/boolean值转换为y/n,如emailOptOut to EMAIL PREFERENCE
    • (重新)设置日期或货币的格式
    • 等等

我从jsonpath开始,但这只解决了上面的1。我已经慢慢地在jsonpath上添加了一种语言来服务2和3,但是对于4我真的没有一个好的答案(除了eval,而且我真的很讨厌这样做)。我查看了JSON/T,但找不到它的python库。我甚至认真考虑过编写一个中间件来将JSON转换成XML,这样我就可以使用XSLT了,但我希望在我绝望之前,S/O的某个人有更好的解决方案。在


Tags: csv数据idjson声明客户schema模式
1条回答
网友
1楼 · 发布于 2024-06-06 08:48:57

为什么不尝试一个类似于以下内容的功能分解:

w = csv.writer(...)
for r in records: 
    l = {}
    for field in fields:
        f_ = rename(field)
        v_ = transform(field, r.get(field, default(field)))
        l[f_] = v_
    w.write(l)

其中rename将旧字段名映射到新字段名,transform根据字段的转换集转换字段的值,default返回要分配给该字段的值。在

所以您只需要定义字段列表和函数:renametransform,和{}。在

举个例子:

^{pr2}$

相关问题 更多 >