【解决错误】json.decoder.JSONDecodeError: Expecting value: line 11 column 14 (char 82)

一、源码

{
    "mode": "sr",
    "use_cl": true,
    "gpu_ids": [0, 1],

    "scale": ,
    "is_train": true,
    "use_chop": true,
    "rgb_range": 255,
    "self_ensemble": false,
    "save_image": false,

    "datasets": {
      "train": {
        "mode": "LRHR",
        "dataroot_HR": "./datasets/Augment/Infra_train_HR_aug/x4",
        "dataroot_LR": "./datasets/Augment/Infra_train_LR_aug/x4",
        "data_type": "npy",
        "n_workers": 4,
        "batch_size": 16,
        "LR_size": 40,
        "use_flip": true,
        "use_rot": true,
        "noise": "."
      },
      "val": {
        "mode": "LRHR",
        "dataroot_HR": "./datasets/Augment/Infra_val_HR_aug/x4",
        "dataroot_LR": "./datasets/Augment/Infra_val_LR_aug/LRBI/x4",
        "data_type": "img"
      }
    }
}

二、报错

Traceback (most recent call last):
  File "train.py", line 161, in <module>
    main()
  File "train.py", line 24, in main
    opt = option.parse(opt)
  File "/SRFBN_Boom/options/options.py", line 23, in parse
    opt = json.loads(json_str, object_pairs_hook=OrderedDict) # 字典
  File "/home/anaconda3/envs/IamComing/lib/python3.7/json/__init__.py", line 361, in loads
    return cls(**kw).decode(s)
  File "/home/anaconda3/envs/uIamComing/lib/python3.7/json/decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/home/anaconda3/envs/IamComing/lib/python3.7/json/decoder.py", line 355, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 11 column 14 (char 79)

三、解决方案

  • 错误解读:json.decoder.JSONDecodeError: Expecting value: line 11 column 14 (char 79)是说 在 第11行第14列(字符79)处有误,一般情况就是是不是出现了其他符号,或者漏打了逗号,导致json无法识别。
  • 因为json文件只能识别字典类型的数据,也就是花括号{},同时要成对,字典也可以嵌套。
  • 经过仔细的检查,我发现自己的是在scale参数那里漏掉了数字,然后导致后面的出错,读取不到scale的参数。
  • 同时,有时候报错的位置不一定对,但是我们认真找还是可以找出来的,毕竟自己的程序自己肯定熟悉。
```python
{
    "mode": "sr",
    "use_cl": true,
    "gpu_ids": [0, 1],

    "scale": 4, # 出错的位置,这是修改正确的,补上了超分辨率放大的倍数这个参数。
    "is_train": true,
    "use_chop": true,
    "rgb_range": 255,
    "self_ensemble": false,
    "save_image": false,
}    

四、后续

  • 解决完这个错误之后,又出现了一个新的问题,
RuntimeError: CUDA out of memory. Tried to allocate 20.00 MiB (GPU 0; 10.76 GiB total capacity; 193.96 MiB already allocated; 6.44 MiB free; 16.04 MiB cached)

  • 不多说了,显存不够,另一卡被占用了,我要去买英伟达新出的RTX2090显卡去了,还是自己的东西靠得住,毕竟腰板硬~~~~[哭泣 哭泣]] [哭泣]
### JSONDecodeError 错误分析 `json.decoder.JSONDecodeError: Expecting value: line 8 column 20 (char 306)` 表明在解析JSON数据时出现了问题,具体是在第8行、第20列的位置遇到了无法识别的内容。这种错误通常由以下几个原因之一引起: 1. **输入数据为空**:如果传递给 `json.loads()` 或其他解析方法的数据是一个空字符串,则会触发此错误[^2]。 2. **JSON 数据格式不正确**:JSON 的语法非常严格,任何多余的逗号、未闭合的大括号 `{}` 或方括号 `[]` 都可能导致解析失败。 3. **编码问题**:某些情况下,文件可能包含不可见字符(如 BOM 字符),这些字符可能会干扰 JSON 解析器的工作。 4. **意外中断的传输或读取操作**:当从网络请求或其他外部资源获取数据时,如果数据流被部分截断或者未能完全加载到内存中,也可能引发此类错误。 以下是针对该问题的具体解决方案以及预防措施: --- #### 方法一:验证并清理输入数据 确保传入的 JSON 数据有效且无多余空白字符。可以先打印原始数据来确认其结构是否符合预期: ```python import json data = """{"key": "value", ...}""" # 替换为实际接收到的数据 try: parsed_data = json.loads(data.strip()) # 使用 strip() 去除首尾空白字符 except json.JSONDecodeError as e: print(f"JSON Decode Error: {e}") ``` 上述代码通过调用 `.strip()` 移除了潜在的前导和尾随空白字符,从而减少因隐含空格而导致的异常情况发生概率[^3]。 --- #### 方法二:逐步调试定位问题位置 利用捕获到的异常对象中的属性信息精确定位问题所在区域。例如,在下面的例子中展示了如何提取出错点附近的子串以便进一步审查: ```python def debug_json_error(json_string, error): problem_index = error.pos snippet_start = max(0, problem_index - 50) snippet_end = min(len(json_string), problem_index + 50) problematic_snippet = f"...{json_string[snippet_start:snippet_end]}..." return problematic_snippet raw_json = "{...}" # 实际使用的 JSON 字符串 try: result = json.loads(raw_json) except json.JSONDecodeError as err: faulty_part = debug_json_error(raw_json, err) print(f"Parsing failed near this part of the string:\n'{faulty_part}'\nDetails:{err}") ``` 这种方法能够帮助开发者快速找到有问题的部分,并集中精力修复它。 --- #### 方法三:处理特殊情况下的边界条件 对于动态生成或来自第三方接口返回的结果,建议增加额外的安全防护机制以应对各种极端情形。比如设置默认值防止接收端崩溃;又或者是采用更宽松的方式预处理待解析内容后再正式执行转换动作。 ```python from urllib.parse import unquote_plus malformed_input = "%7B%22test%22%3Atrue%7D" # URL-encoded JSON example decoded_str = unquote_plus(malformed_input) if decoded_str.startswith("{") and decoded_str.endswith("}") or \ decoded_str.startswith("[") and decoded_str.endswith("]"): try: safe_dict = json.loads(decoded_str) except Exception as exc: fallback_value = {} # Define appropriate default behavior here. else: raise ValueError("Invalid input format.") ``` 这里演示了一个简单的场景——假设我们收到了经过URL编码后的JSON文本作为参数之一。为了提高兼容性和鲁棒性,我们可以先对其进行解码然后再继续后续流程。 --- ### 总结 综上所述,要彻底消除类似于 `'Expecting value: line X column Y'` 这样的报错提示,就需要仔细检查每一个环节是否存在隐患因素影响最终效果呈现。这包括但不限于核实源头材料本身质量状况良好与否、采取适当手段规避常见陷阱等等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值