我正在使用json.loads()来识别数据框中的特定列是否为json列。这就是我在函数中的表现 -
df_col.apply( lambda x : json.loads(x) if x is not None else x)
如果x不是json,则返回false,否则为true,我使用此输出进一步处理我的数据。
但是,我看到这个输入为char的整数值失败了。
例如,
import json
d1 = 20180304
json.loads(d1) # outputs error, expected string. this is an expected output
d2 = 'abc'
json.loads(d2) #outputs ValueError: No JSON object could be decoded. this is an expected output
d3 = '{"a":"hello"}'
json.loads(d3) #returns true for actual json, expected output
d4 = '123'
json.loads(d4) #outputs true here, casted int(123) as varchar and used function
由于d4的这种行为,所有int值(被转换为char)都被标识为json元素。这是josn.loads()的正确行为。如何正确地将整数列标识为非json元素
答案 0 :(得分:1)
如果你想要实现的只是修改json.loads
的行为,以便抛弃代表(非负)整数的字符串,你可以制作一个自定义的JSONDecoder
并随之滚动。
class Decoder(json.JSONDecoder):
def decode(self, s):
if s.isdigit():
raise ValueError('all characters in string were digits')
return super().decode(s)
有了这个,
In [5]: json.loads('{"a": 123}', cls=Decoder)
Out[5]: {'a': 123}
In [6]: json.loads('123', cls=Decoder)
ValueError: all characters in string were digits
答案 1 :(得分:1)
A number by itself is a perfectly valid JSON text
如果您正在尝试应用过时的" JSON文档"而不是" JSON文本",从来没有明确定义,但最接近定义的东西是这样的:
def if_json_doc(s):
try:
obj = json.loads(obj)
return isinstance(obj, (dict, list))
except JSONDecodeError:
return False
如果您有其他规则,例如" JSON对象,数组,布尔值或未定义,但不是null或数字",那么如何修改它以适合您的规则应该是非常明显的。唯一困难的部分是弄清楚你真正想要的规则。
答案 2 :(得分:0)
是的,字符串StringProperty
是有效的JSON语法,表示数字123.如果您关心的是输入是否是有效的JSON,那么您确实应该接受输入{{ 1}}作为JSON。
实际上,您可能还有其他约束,例如,所有JSON数据都应该代表一个对象。 (您甚至可以在尝试解码数据之前轻松检查这一点,因为JSON编码的对象始终以TreeTableView<Person> table = ..;
TreeTableColumn<Person, String> column = ...;
column.setCellValueFactory(dataFeatures -> {
// This could all be done in one line but I figured I'd
// make it explicit to show all the types used.
TreeItem<Person> item = dataFeatures.getValue();
Person person = item.getValue();
return person.nameProperty(); // returns StringProperty which is an
// ObservableStringValue which in turn
// is an ObservableValue<String>
});
开头,可选地前面有空格。)
但您真正的问题可能是您的数据格式不明确,而正确的解决方案是重新设计您的系统,使其不是。这可能意味着例如要求允许JSON的列中的所有数据值(或至少所有非空值)实际上必须是JSON编码。