"""Read from and write to JSON."""
import json
from ..convert import dict_to_hypergraph
from ..exception import XGIError
__all__ = ["write_json", "read_json"]
[docs]def write_json(H, path):
"""
A function to write a file in a standardized JSON format.
Parameters
----------
H: Hypergraph object
The specified hypergraph object
path: string
The path of the file to read from
"""
# initialize empty data
data = {}
# name always gets written (default is an empty string)
data["hypergraph-data"] = {}
data["hypergraph-data"].update(H._hypergraph)
# get node data
try:
data["node-data"] = {str(idx): H.nodes[idx] for idx in H.nodes}
except KeyError:
raise XGIError("Node attributes not saved!")
try:
data["edge-data"] = {str(idx): H.edges[idx] for idx in H.edges}
except KeyError:
raise XGIError("Edge attributes not saved!")
# hyperedge dict
data["edge-dict"] = {
str(idx): [str(n) for n in H.edges.members(idx)] for idx in H.edges
}
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
-------
A Hypergraph object
The loaded hypergraph
Raises
------
XGIError
If the JSON is not in a format that can be loaded.
"""
with open(path) as file:
data = json.loads(file.read())
return dict_to_hypergraph(data, nodetype=nodetype, edgetype=edgetype)