2014-09-26 62 views
-1

我試過ast.literal_eval和json.loads,但是這兩個都沒有在提供字符串時維護json屬性的序列。請看下面的例子 -str在python中的字典,但保持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字典?

+3

字典是無序的,並且通常不需要進行排序。如果你只是想要打印,可以考慮使用一些自定義的'key'函數來排列元素。另外,如果你將元素插入到循環中的dict中,你可以使用'collections.OrderedDict',但我認爲這不適用於'json'。 – 2014-09-26 10:43:28

+0

那就是我想說的'。 – 2014-09-26 10:44:31

+0

其實我想要將字符串轉換爲字典,但鍵應該與它們在提供的字符串中的順序相同。而在collections.OrderedDict中,它不會將字符串作爲輸入,即整個字符串,可以將其轉換爲字典。 – 2014-09-26 10:59:57

回答

4

正如tobias_k所說,python字典是無序的,因此只要將數據加載到一個數據庫中,就會丟失任何訂單信息。

你可以,但是,你的JSON字符串加載到OrderedDict:

​​

這種方法is mentioned in the json module documentation

+0

可愛,完全適合,對於愚蠢的問題抱歉。我對python非常陌生,在搜索了很多之後,我找不到答案。 – 2014-09-26 11:20:15

+0

+1不錯,不知道這個參數。 – 2014-09-26 12:17:43

相關問題