Skip to content

Commit 3d8945b

Browse files
committed
Writing pesudocode and trying to find rust crate that can find the start and end of an array/object
1 parent 1f633e3 commit 3d8945b

2 files changed

Lines changed: 187 additions & 9 deletions

File tree

src/main.rs

Lines changed: 110 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,124 @@
1+
use oxrdf::NamedOrBlankNode;
2+
use serde_json::Value;
3+
use std::collections::{HashMap, VecDeque};
4+
use std::fs::File;
5+
use std::io::BufReader;
16
use struson::reader::*;
27

38
fn main() {
4-
// let json = r#"{"a": true}"#;
5-
// let mut json_reader = JsonStreamReader::new(json.as_bytes());
9+
// build using struson
10+
//-------------------------
11+
let mut json_reader = JsonStreamReader::new(
12+
r#"{
13+
"aircraft": {
14+
"id": "A12345",
15+
"model": "Boeing 747",
16+
"manufacturer": "Boeing",
17+
"capacity": {
18+
"seats": 416,
19+
"cargo_volume": 150.4
20+
}
21+
}
22+
}"#
23+
.as_bytes(),
24+
);
25+
26+
let mut subject_stack: VecDeque<NamedOrBlankNode> = VecDeque::new();
27+
let mut array_properties: HashMap<NamedOrBlankNode, NamedOrBlankNode> = HashMap::new();
28+
29+
json_reader.begin_object().unwrap();
30+
json_reader.next_name().unwrap();
31+
32+
// println!("hi");
33+
34+
// json_reader.begin_array().unwrap();
35+
// assert_eq!(json_reader.next_number::<u32>().unwrap().unwrap(), 1);
36+
// assert_eq!(json_reader.next_bool().unwrap(), true);
37+
// json_reader.end_array().unwrap();
638

7-
let mut json_reader = JsonStreamReader::new(r#"{"a": 1, "b": 2}"#.as_bytes());
839
json_reader.begin_object().unwrap();
940

1041
while json_reader.has_next().unwrap() {
1142
match json_reader.peek().unwrap() {
12-
ValueType::Boolean => println!("A boolean: {}", json_reader.next_bool().unwrap()),
13-
ValueType::String => println!("A string: {}", json_reader.next_str().unwrap()),
43+
ValueType::Array => match token {
44+
if token
45+
},
46+
ValueType::Object => todo!(),
47+
ValueType::String => println!("A string: {}", json_reader.next_string().unwrap()),
48+
ValueType::Boolean => println!("a bool: {}", json_reader.next_bool().unwrap()),
49+
ValueType::Number => println!(
50+
"A string: {}",
51+
json_reader.next_number::<u32>().unwrap().unwrap()
52+
),
53+
1454
_ => panic!("Unexpected type"),
1555
}
16-
17-
// json_reader.skip_name().unwrap();
18-
// json_reader.skip_value().unwrap();
19-
// println!("SKIPPED");
2056
}
2157

2258
json_reader.end_object().unwrap();
59+
// Ensures that there is no trailing data
60+
json_reader.consume_trailing_whitespace().unwrap();
61+
//-------------------------
62+
63+
//built using serde_json
64+
//-------------------------
65+
// let file = File::open("src/airplane.json").unwrap();
66+
// let reader = BufReader::new(file);
67+
68+
// // Parse the JSON file into a serde_json::Value
69+
// let json_data: Value = serde_json::from_reader(reader).unwrap();
70+
// parse_json(&json_data);
71+
//-------------------------
2372
}
73+
74+
fn parse_json(value: &Value) {
75+
match value {
76+
Value::Null => println!("null"),
77+
Value::Bool(b) => println!("Boolean: {}", b),
78+
Value::Number(n) => println!("Number: {}", n),
79+
Value::String(s) => println!("String: {}", s),
80+
Value::Array(arr) => {
81+
println!("Array:");
82+
for (index, item) in arr.iter().enumerate() {
83+
print!("Index {}: ", index);
84+
parse_json(item);
85+
}
86+
}
87+
Value::Object(obj) => {
88+
println!("Object:");
89+
for (key, val) in obj.iter() {
90+
print!("Key: {}, Value: ", key);
91+
parse_json(val);
92+
}
93+
}
94+
}
95+
}
96+
97+
98+
// psuedocode
99+
// subject array
100+
// properties array
101+
102+
// property = null
103+
104+
// While Next val exists
105+
106+
// if start of array
107+
108+
// if end of array
109+
110+
// if start of object
111+
// create blank node
112+
// if property exists and subject isnt empty create triples with subject array.last(),property,subject)
113+
// add blank node to subject array to track
114+
// if end of object
115+
// .pop() on subject array
116+
// WHAT DOES THIS MEAN( if (!subjectStack.isEmpty() && arrayProperties.containsKey(subjectStack.getLast())) property = arrayProperties.get(subjectStack.getLast());)
117+
// if string
118+
// create triple with last element of blank node array, property , string val
119+
// if number
120+
// create triple with last element of blank node array, property , number val
121+
// if bool
122+
// create triple with last element of blank node array, property , bool val
123+
// if key_name
124+
// property = key_name

src/test.rs

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
use serde::de::value;
2+
use serde_json::{Result, Value};
3+
use std::collections::HashMap;
4+
use std::fs::{self, File};
5+
use std::io::{BufReader, Read};
6+
7+
use rdf::node::Node;
8+
use rdf::triple::Triple;
9+
use rdf::uri::Uri;
10+
use rio_api::model::*;
11+
use rio_turtle::TurtleFormatter;
12+
use std::io;
13+
14+
struct Graph {
15+
nodes: HashMap<String, Vec<String>>,
16+
}
17+
18+
impl Graph {
19+
fn new() -> Self {
20+
Self {
21+
nodes: HashMap::new(),
22+
}
23+
}
24+
25+
fn add_edge(&mut self, from: String, to: String) {
26+
self.nodes.entry(from).or_insert_with(Vec::new).push(to);
27+
}
28+
}
29+
30+
fn json_to_graph(value: &Value, graph: &mut Graph, parent_key: Option<String>) {
31+
match value {
32+
Value::Object(map) => {
33+
for (key, value) in map {
34+
let current_key = parent_key.clone().unwrap_or_else(|| "".to_string()) + "." + key;
35+
if let Some(parent) = &parent_key {
36+
graph.add_edge(parent.clone(), current_key.clone());
37+
}
38+
json_to_graph(value, graph, Some(current_key));
39+
}
40+
}
41+
Value::Array(arr) => {
42+
for (index, value) in arr.iter().enumerate() {
43+
let current_key = parent_key.clone().unwrap_or_else(|| "".to_string())
44+
+ "["
45+
+ &index.to_string()
46+
+ "]";
47+
if let Some(parent) = &parent_key {
48+
graph.add_edge(parent.clone(), current_key.clone());
49+
}
50+
json_to_graph(value, graph, Some(current_key));
51+
}
52+
}
53+
Value::String(string) => {
54+
println!("{}", string);
55+
}
56+
_ => {}
57+
}
58+
}
59+
60+
fn main() -> serde_json::Result<()> {
61+
let file_path = "/home/bharath/documents/github/json2rdf/src/airplane.json";
62+
let file = File::open(file_path).unwrap();
63+
let reader = BufReader::new(file);
64+
let json_value: Value = serde_json::from_reader(reader).unwrap();
65+
66+
let mut graph = Graph::new();
67+
json_to_graph(&json_value, &mut graph, None);
68+
69+
for (node, edges) in &graph.nodes {
70+
println!("Node: {}", node);
71+
for edge in edges {
72+
println!(" -> {}", edge);
73+
}
74+
}
75+
76+
Ok(())
77+
}

0 commit comments

Comments
 (0)