{"id":13822583,"url":"https://github.com/moshe-kabala/jst","last_synced_at":"2025-05-16T17:31:14.241Z","repository":{"id":62441451,"uuid":"239835966","full_name":"moshe-kabala/jst","owner":"moshe-kabala","description":"Write a javascript object in rust","archived":false,"fork":false,"pushed_at":"2020-04-11T19:52:40.000Z","size":89,"stargazers_count":4,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2024-10-31T11:48:10.127Z","etag":null,"topics":["json","json-schema","rust"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/moshe-kabala.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-02-11T18:36:24.000Z","updated_at":"2024-03-25T20:58:20.000Z","dependencies_parsed_at":"2022-11-01T21:51:24.676Z","dependency_job_id":null,"html_url":"https://github.com/moshe-kabala/jst","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/moshe-kabala%2Fjst","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/moshe-kabala%2Fjst/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/moshe-kabala%2Fjst/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/moshe-kabala%2Fjst/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/moshe-kabala","download_url":"https://codeload.github.com/moshe-kabala/jst/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":225068941,"owners_count":17416146,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["json","json-schema","rust"],"created_at":"2024-08-04T08:02:07.238Z","updated_at":"2024-11-19T23:30:40.465Z","avatar_url":"https://github.com/moshe-kabala.png","language":"Rust","funding_links":[],"categories":["Rust"],"sub_categories":[],"readme":"# Jst\n\nThe package includes:\n\n1. JSON data structure\n2. JSON parser\n3. JSON to string\n4. Macros to writing JSON same as a Javascript object\n\n# Convertors and Macros\n\n## Macros\n\nThe package support obj!, val!, and arr! macros to write any json object in much more convinces way ( Write like JavaScript Object syntax and getting completion error).\n\n### Json macro\n\n```\n    // basic usage\n\n    let dog = obj! {\n      color: \"brown\",\n      type: \"Akbash\",\n      eating : [\n        \"WholeHearted\",\n        \"Royal Canin\"\n      ]\n    };\n\n    // advance usage\n\n    let key = \"var_key\";\n    let age = 45;\n    let like_banana = true;\n\n    let person = obj! {\n        name: \"jhon\",\n        // use value name as a key\n        age,\n        like_banana,\n        like_rust: true,\n        like_go: null,\n        emails : [\n            \"some@gmail.com\",\n            \"some2@gmail.com\"\n        ],\n        // you can flat obj into - the dog is copy not moved\n        ...dog\n        address: {\n            city: \"somewhere\",\n            zip: 5612\n        },\n        \"literal\": true,\n        [key]: \"var_key\",\n        age: 56\n    };\n```\n\n### value macro\n\nCreate json::Val enum from any valid json format\n\n```\n\nlet str = val!(\"some string\");\nlet num = val!(45);\nlet bool = val!(true);\nlet null = val!(null);\nlet array = val!([\"string\", 45]);\n\nlet json = val!({\n  key:\"string\",\n  num:45\n});\n\n```\n\n### array macro\n\nCreate a Vec\\\u003cjson::Val\\\u003e vector.\n\n```\n// the type is Vec\u003cVal\u003e\nlet arr = arr![\n  \"string\",\n  45,\n  true,\n  [],\n  {key: \"value\"}\n];\n\n\n// Extend the arr2 by ...arr\nlet arr2 = arr![\n  ...arr,\n  \"val\"\n];\n\n```\n\n## Convertors\n\nForm any numerical number, String, \u0026str, boolean and HashMap\u003cString, json::Val\u003e you can call 'into()' method to convert the value to Obj::Val enum\n\n```\nlet str:Val = \"some string\".into();\nlet num:Val = 78.into();\nlet bool:Val = true.into();\nlet array:Val = vec![\"string\".into(), 45.into()];\n\n// the short way is to use macros (obj!, val! and arr!)\n\nlet str = val!(\"some string\");\nlet num = val!(54);\nlet bool = val!(true);\nlet null = val!(null);\nlet array_val = val!([\"string\", 45]);\n// the type is Vec\u003cVal\u003e\nlet array = arr![\"string\", 45];\n\nlet obj_val = val!({\n  key:\"string\",\n  num:45\n});\n// the type is Object\nlet obj = obj!{\n  key:\"string\",\n  num:45\n};\n\n\n```\n\n# Parser\n\nParse a json from a string\n\n```\nuse json::{Val, Json};\n\nfn main() {\n\n  let mut j = Obj::new();\n\n  let from_string = Obj::from(\n    r#\"{\n      \"number\": 56,\n      \"string\": \"some string\\\" string\",\n      \"boolean_true\": true,\n      \"boolean_false\": false,\n      \"null\": null,\n      \"obj\": {\n        \"key1\": 456\n      },\n      \"empty_obj\": {},\n      \"empty_obj_new_line\": {\n\n      },\n      \"nested_obj\" : {\n        \"nested1\": {\n          \"nested2\": {\n            \"key1\": \"some value\",\n            \"key2\": \"anther value\"\n          }\n        }\n      },\n      \"array\": [4564, \"some string\", {\"bla\":90, \"blo\": \"sfsf\"}, null, true, false, [], [4,5]],\n      \"key\": 2\n    }\n  \"#,\n  );\n\n\n  // Print either json or err\n  if let Ok(Val::Obj(v)) = from_string {\n    println!(\"{:?}\", v);\n  } else if let Err(e) = from_string {\n    println!(\"{:?}\", e)\n  }\n}\n```\n\n```\nlet val = Val::from(\"[3, 5, null]\");\n\nif let Ok(v) = val) {\n  assert_eq!(v, Val::Array(vec![Val::Num(3.0), Val::Num(5.0), Val::Null])) // true\n}\n```\n## Contribute\nAny donation is welcome, open Issues, PR and request for new features.\n\n# Limitation\nWhen using in an obj! macro with a big object you need to config \n#![recursion_limit = \"512\"]\n\n\n## Todo\n\n1. Improve parser tests\n2. Improve indexer (enable to set a value by index)\n3. Adding Error code\n4. Serialize and Deserialize\n5. macro for destructuring object and array\n6. Adding json-schema validator\n7. Support yml format\n8. Option to use share pointer for object and array\n9. Consider using the indexmap crate instead of HeadMap (for keeping insert order)\n\n# Licence\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmoshe-kabala%2Fjst","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmoshe-kabala%2Fjst","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmoshe-kabala%2Fjst/lists"}