spdx_tools.spdx.parser.json.json_parser

 1# SPDX-FileCopyrightText: 2022 spdx contributors
 2#
 3# SPDX-License-Identifier: Apache-2.0
 4import json
 5
 6from beartype.typing import Any, Dict
 7
 8from spdx_tools.spdx.model import Document
 9from spdx_tools.spdx.parser.jsonlikedict.json_like_dict_parser import JsonLikeDictParser
10
11# chars we don't want to see in SBOMs
12CONTROL_CHARS_MAP = {
13    8: None,  # ASCII/UTF-8: backspace
14    12: None,  # ASCII/UTF-8: formfeed
15}
16
17
18def remove_control_chars_from_value(value: Any) -> Any:
19    if isinstance(value, str):
20        return value.translate(CONTROL_CHARS_MAP)
21    elif isinstance(value, list):
22        for i in range(len(value)):
23            value[i] = remove_control_chars_from_value(value[i])
24    return value
25
26
27def remove_json_control_chars_hook(pairs: list) -> dict:
28    return {k: remove_control_chars_from_value(v) for k, v in pairs}
29
30
31def parse_from_file(file_name: str, encoding: str = "utf-8") -> Document:
32    with open(file_name, encoding=encoding) as file:
33        input_doc_as_dict: Dict = json.load(file, object_pairs_hook=remove_json_control_chars_hook)
34
35    return JsonLikeDictParser().parse(input_doc_as_dict)
CONTROL_CHARS_MAP = {8: None, 12: None}
def remove_control_chars_from_value(value: Any) -> Any:
19def remove_control_chars_from_value(value: Any) -> Any:
20    if isinstance(value, str):
21        return value.translate(CONTROL_CHARS_MAP)
22    elif isinstance(value, list):
23        for i in range(len(value)):
24            value[i] = remove_control_chars_from_value(value[i])
25    return value
def remove_json_control_chars_hook(pairs: list) -> dict:
28def remove_json_control_chars_hook(pairs: list) -> dict:
29    return {k: remove_control_chars_from_value(v) for k, v in pairs}
def parse_from_file( file_name: str, encoding: str = 'utf-8') -> spdx_tools.spdx.model.document.Document:
32def parse_from_file(file_name: str, encoding: str = "utf-8") -> Document:
33    with open(file_name, encoding=encoding) as file:
34        input_doc_as_dict: Dict = json.load(file, object_pairs_hook=remove_json_control_chars_hook)
35
36    return JsonLikeDictParser().parse(input_doc_as_dict)