json.load()函数解码整数

时间:2018-03-29 18:25:05

标签: python json

我正在使用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元素

3 个答案:

答案 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编码。