Source code for xgi.readwrite.json
"""Read from and write to JSON."""
import json
from collections import defaultdict
from os.path import dirname, join
from warnings import warn
from ..convert import from_hypergraph_dict, to_hypergraph_dict
from ..core import Hypergraph, SimplicialComplex
__all__ = ["write_json", "read_json"]
[docs]def write_json(H, path, collection_name=""):
"""
A function to write a file in a standardized JSON format.
If the dataset is a collection, makes local copies of all the
datasets in the collection and a main file pointing to all of
the datasets.
Parameters
----------
H: Hypergraph object
The specified hypergraph object
path: string
The path of the file to write to. If the data is a collection,
it is the directory in which to put all the files.
collection_name : str
The name of the collection of data (if any). If `H` is not
a collection, this argument is unused.
Raises
------
XGIError
If the node or edge IDs have conflicts after casting
to strings, e.g., node IDs "2" and 2.
"""
warn("This function is deprecated in favor of the 'write_hif()' function")
if collection_name:
collection_name += "_"
if isinstance(H, list):
collection_data = defaultdict(dict)
for i, H in enumerate(H):
fname = f"{path}/{collection_name}{i}.json"
collection_data["datasets"][i] = {
"relative-path": f"{collection_name}{i}.json"
}
write_json(H, fname)
collection_data["type"] = "collection"
datastring = json.dumps(collection_data, indent=2)
with open(
f"{path}/{collection_name}collection_information.json", "w"
) as output_file:
output_file.write(datastring)
elif isinstance(H, dict):
collection_data = defaultdict(dict)
for name, H in H.items():
fname = f"{path}/{collection_name}{name}.json"
collection_data["datasets"][name] = {
"relative-path": f"{collection_name}{name}.json"
}
write_json(H, fname)
collection_data["type"] = "collection"
datastring = json.dumps(collection_data, indent=2)
with open(
f"{path}/{collection_name}collection_information.json", "w"
) as output_file:
output_file.write(datastring)
elif isinstance(H, (Hypergraph, SimplicialComplex)):
data = to_hypergraph_dict(H)
datastring = json.dumps(data, indent=2)
with open(path, "w") as output_file:
output_file.write(datastring)
[docs]def read_json(path, nodetype=None, edgetype=None):
"""
A function to read a file in a standardized JSON format.
Parameters
----------
data: dict
A dictionary in the hypergraph JSON format
nodetype: type, optional
type that the node IDs will be cast to
edgetype: type, optional
type that the edge IDs will be cast to
Returns
-------
Hypergraph
The loaded hypergraph. If the dataset chosen is a collection,
returns a dictionary of Hypergraph objects.
Raises
------
XGIError
If the JSON is not in a format that can be loaded.
"""
warn("This function is deprecated in favor of the 'read_hif()' function")
with open(path) as file:
jsondata = json.loads(file.read())
if "type" in jsondata and jsondata["type"] == "collection":
collection = {}
for name, data in jsondata["datasets"].items():
relpath = data["relative-path"]
H = read_json(
join(dirname(path), relpath), nodetype=nodetype, edgetype=edgetype
)
collection[name] = H
return collection
return from_hypergraph_dict(jsondata, nodetype=nodetype, edgetype=edgetype)