str在python中进行dict,但保持json属性的顺序

时间:2014-09-26 10:40:08

标签: python json

我已经尝试了ast.literal_eval和json.loads,但是这两者都没有在提供字符串时维护json属性的顺序。请参阅以下示例 -

将字符串提供给json.loads -

之前的字符串
{
    "type": "array",
    "properties": {
        "name": {
            "type": "string"
        },
        "i": {
            "type": "integer"
        },
        "strList": {
            "type": "array",
            "items": {
                "type": "string"
            }
        },
        "strMap": {
            "type": "object"
        },
        "p2": {
            "type": "array",
            "items": {
                "type": "object",
                "properties": {
                    "name": {
                        "type": "string"
                    },
                    "i": {
                        "type": "integer"
                    },
                    "p3": {
                        "type": "object",
                        "properties": {
                            "name": {
                                "type": "string"
                            },
                            "i": {
                                "type": "integer"
                            },
                            "p4": {
                                "type": "object",
                                "properties": {
                                    "name": {
                                        "type": "string"
                                    },
                                    "i": {
                                        "type": "integer"
                                    }
                                }
                            }
                        }
                    }
                }
            }
        },
        "p3": {
            "type": "array",
            "items": {
                "type": "object",
                "properties": {
                    "name": {
                        "type": "string"
                    },
                    "i": {
                        "type": "integer"
                    },
                    "p4": {
                        "type": "object",
                        "properties": {
                            "name": {
                                "type": "string"
                            },
                            "i": {
                                "type": "integer"
                            }
                        }
                    }
                }
            }
        },
        "b": {
            "type": "boolean",
            "required": true
        }
    },
    "classnames": {
        "rootNode": {
            "classname": "com.agent.Person"
        },
        "p2": {
            "classname": "com.agent.Person2",
            "p3": {
                "classname": "com.agent.Person3",
                "p4": {
                    "classname": "com.agent.Person4"
                }
            }
        },
        "p3": {
            "classname": "com.agent.Person3",
            "p4": {
                "classname": "com.agent.Person4"
            }
        }
    }
}
提供给json.loads后的

字符串 -

{
    'classnames': {
        'p2': {
            'classname': 'com.agent.Person2',
            'p3': {
                'classname': 'com.agent.Person3',
                'p4': {
                    'classname': 'com.agent.Person4'
                }
            }
        },
        'p3': {
            'classname': 'com.agent.Person3',
            'p4': {
                'classname': 'com.agent.Person4'
            }
        },
        'rootNode': {
            'classname': 'com.agent.Person'
        }
    },
    'properties': {
        'b': {
            'required': True,
            'type': 'boolean'
        },
        'i': {
            'type': 'integer'
        },
        'name': {
            'type': 'string'
        },
        'p2': {
            'items': {
                'properties': {
                    'i': {
                        'type': 'integer'
                    },
                    'name': {
                        'type': 'string'
                    },
                    'p3': {
                        'properties': {
                            'i': {
                                'type': 'integer'
                            },
                            'name': {
                                'type': 'string'
                            },
                            'p4': {
                                'properties': {
                                    'i': {
                                        'type': 'integer'
                                    },
                                    'name': {
                                        'type': 'string'
                                    }
                                },
                                'type': 'object'
                            }
                        },
                        'type': 'object'
                    }
                },
                'type': 'object'
            },
            'type': 'array'
        },
        'p3': {
            'items': {
                'properties': {
                    'i': {
                        'type': 'integer'
                    },
                    'name': {
                        'type': 'string'
                    },
                    'p4': {
                        'properties': {
                            'i': {
                                'type': 'integer'
                            },
                            'name': {
                                'type': 'string'
                            }
                        },
                        'type': 'object'
                    }
                },
                'type': 'object'
            },
            'type': 'array'
        },
        'strList': {
            'items': {
                'type': 'string'
            },
            'type': 'array'
        },
        'strMap': {
            'type': 'object'
        }
    },
    'type': 'array'
}

任何人都可以在python中建议一个替代品或者什么东西保持属性的顺序并将字符串转换为python字典吗?

1 个答案:

答案 0 :(得分:4)

正如tobias_k所说,python词典是无序的,所以一旦你将数据加载到一个词典中,你就会丢失任何订单信息。

但是,您可以将JSON字符串加载到OrderedDict:

from collections import OrderedDict
import json

json.loads(your_json_string, object_pairs_hook=OrderedDict)

此方法is mentioned in the json module documentation