我有一个看起来像这样的字符串:
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。 非常感谢。
答案 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
答案 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