Pythonic方法解析格式化的字符串并从中获取字典

时间:2018-04-10 14:33:48

标签: python string dictionary

我有一个看起来像这样的字符串:

import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import org.apache.commons.codec.binary.Hex;

public String getHashSHA512(String StringToHash, String salt){
        String generatedPassword = null;
        try {
            MessageDigest md = MessageDigest.getInstance("SHA-512");
            md.update(salt.getBytes(StandardCharsets.UTF_8));
            byte[] bytes = md.digest(StringToHash.getBytes(StandardCharsets.UTF_8));
            generatedPassword = Hex.encodeHexString(bytes);
        }
        catch (NoSuchAlgorithmException e){
            e.printStackTrace();
        }
        return generatedPassword;
    }

任何人都可以告诉我python中的正确方法是从字典中获取字典

{
    "key A":[
        ["some val", "value a1"],
        ["some val", "value a2"],
        ....................
        ["some val", "value an"]
    ], "key B":[
        ["some val", "value b1"],
        ["some val", "value b2"],
        ...
    ], ...
     , "key X":[
        ["some val", "value x1"],
        ["some val", "value x2"],
        ...
    ]
}

我问这个是因为现在我能想到的唯一代码是一个非常脏的代码,有很多列表,拆分和替换,我很确定这是非常错误的做法它:D。 非常感谢。

4 个答案:

答案 0 :(得分:4)

您可以将Error2与字典理解结合使用:

ast.literal_eval

答案 1 :(得分:3)

因为eval通常被认为是不安全的,并且python词典“通常”与JSON兼容,只要所有值都与JSON兼容。 我建议:

import json

mystr = """{
    "key A":[
        ["some val", "value a1"],
        ["some val", "value a2"],
        ["some val", "value an"]
    ], "key B":[
        ["some val", "value b1"],
        ["some val", "value b2"]
    ], "key X":[
        ["some val", "value x1"],
        ["some val", "value x2"]
    ]
}"""

res = json.loads(mystr)

用于处理尾随逗号:

import json
from jsoncomment import JsonComment


mystr = """{
    "key A":[
        ["some val", "value a1"],
        ["some val", "value a2"],
        ["some val", "value an"]
    ], "key B":[
        ["some val", "value b1"],
        ["some val", "value b2"],
    ], "key X":[
        ["some val", "value x1"],
        ["some val", "value x2"],
    ]
}"""

res = JsonComment(json).loads(mystr)

JsonComment的文档:https://pypi.python.org/pypi/jsoncomment

参考:Can json.loads ignore trailing commas?

答案 2 :(得分:1)

正如其他人所指出的那样,问题是json字符串的list元素末尾的非标准尾随逗号。

您可以在示例中使用ast.literal_eval()

但是,如果您需要编写自己的json解析器来处理Python库解析器无法处理的json,您可以使用PyParsing来执行此操作。

用PyParsing编写的example JSON parser可以很容易地用来处理带有可选尾随逗号的json:

testdata='''\
{
    "key A":[
        ["some val", "value a1"],
        ["some val", "value a2"],
        ["some val", "value an"],
    ], "key B":[
        ["some val", "value b1"],
        ["some val", "value b2"]
    ],
    "key X":[
        ["some val", "value x1"],
        ["some val", "value x2"]
    ]
}'''

json_bnf = """
object 
    { members } 
    {} 
members 
    string : value 
    members , string : value 
array 
    [ elements ]
    [] 
elements 
    value 
    elements , value 
value 
    string
    number
    object
    array
    true
    false
    null
"""

from pyparsing import *
import ast

def make_keyword(kwd_str, kwd_value):
    return Keyword(kwd_str).setParseAction(replaceWith(kwd_value))
TRUE  = make_keyword("true", True)
FALSE = make_keyword("false", False)
NULL  = make_keyword("null", None)

LBRACK, RBRACK, LBRACE, RBRACE, COLON = map(Suppress, "[]{}:")

jsonString = dblQuotedString().setParseAction(removeQuotes)
jsonNumber = pyparsing_common.number()

jsonObject = Forward()
jsonValue = Forward()
jsonElements = delimitedList( jsonValue )
jsonArray = Group(LBRACK + Optional(jsonElements, []) + Optional(Suppress(",")) + RBRACK)
jsonValue << (jsonString | jsonNumber | Group(jsonObject)  | jsonArray | TRUE | FALSE | NULL)
memberDef = Group(jsonString + COLON + jsonValue)
jsonMembers = delimitedList(memberDef)
jsonObject << Dict(LBRACE + Optional(jsonMembers) + RBRACE)

jsonComment = cppStyleComment 
jsonObject.ignore(jsonComment)

结果与解析它的结果相同:

>>> dict(results.asList())==ast.literal_eval(testdata)
True 

在这种情况下,“滚动自己”的优点是可以控制您拥有的非标准元素以及您希望如何处理它们。

(感谢Paul McGuire的PyParsing模块和json解析器......)

答案 3 :(得分:0)

你可以这样做:

your_dictionary = eval(original_str)     

for key, values in your_dictionary.items():
    v = list()
    for value in values:
        v += value
    your_dictionary[key] = v