Take the 2-minute tour ×
Code Review Stack Exchange is a question and answer site for peer programmer code reviews. It's 100% free, no registration required.

I am making a to-do list application in Python that will show tasks/subtasks/sub-sub-tasks in a tree view, but with higher-level clades of tasks grouped into blocks (e.g., Work block, Home block). So something like:

To Do List
|--Home Tasks
|  |--Clean room
|  |--Get storage unit
|
|--Work Tasks
  |--Analysis
  |--Sorting
     |--Save Files
     |  |--Pull from computer 1
     |  |--Walk to computer 2
     |  |--Save on computer 2
     |--Sort files
     |--Plot data

My goal is to store the data as JSON, but I am totally new to this format. I am curious about the quality of the following, and any improvements I could make:

{
    "todoList": 
    [
    {
    "taskBlock": "Home", "tasks":
        [
        {"task": "Clean room", "done": false},
        {"task": "Get storage unit", "done": false}
        ]
    },
    {
    "taskBlock": "Work", "tasks":
        [
        {"task": "Analysis", "done": false},
        {"task": "Sorting", "done": false, "subtasks":
            [
            {"task": "Save files", "done": false, "subtasks":
                [
                {"task": "Pull from computer 1", "done": false},
                {"task": "Walk to computer 2", "done": false},
                {"task": "Save on computer 2", "done": false}        
                ]                
            },
            {"task": "Sort files", "done": false},
            {"task": "Plot data", "done": false}  
            ]
        }
        ]
    }       
    ]
}

I am used to XML, and defining a root item, but frankly I wonder if my "root" item here is superfluous (the 'todoList' parent item).

share|improve this question

1 Answer 1

up vote 2 down vote accepted

You are on the right track! Your hunch is correct that JSON doesn't really have a "root" element the way XML does. Actually, it does have a root - the opening {. Read that as "I am starting an object", the way you'd read the opening element in XML. (The thing about JSON that feels weird if you're used to XML is that you don't actually specify what type of object it is. That's the beauty [and danger] of playing fast and loose with types the way JavaScript does.)

Here's a suggested revision:

{
  "id": 100,
  "belongsToUser": "782950ce-f920-4f98-a69e-a899729e6267",
  "created": "2015-02-05T02:40:31Z",
  "lists": [{
      "name": "Home", 
      "tasks": [
        {
          "name": "Clean room", 
          "done": false

        }, {
          "name": "Get storage unit", 
          "done": false
        }
      ]
    }, {
      "name": "Work", 
      "tasks": [
        {
          "name": "Analysis", 
          "done": false
        }, {
          "name": "Sorting", 
          "done": false, 
          "subtasks": [
            {
              "name": "Save files", 
              "done": false, 
              "subtasks": [
                {
                  "name": 
                  "Pull from computer 1", 
                  "done": false

                }, {
                  "name": "Walk to computer 2", 
                  "done": false

                }, {
                  "name": "Save on computer 2", 
                  "done": false

                }]                
            },
            {
              "name": "Sort files", 
              "done": false

            }, {
              "name": "Plot data",
              "done": false
            }]
        }]
    }]
}

A few things of note:

  • There's no need for a root todoList attribute, but there's plenty of other good metadata that could go at the root level: primary keys or IDs, timestamps, ownership information, and so on.
  • I think it makes sense to have a lists array at the root, and then have object for each clade (the Home and Work blocks) under that.
  • Each list object can have metadata of its own (name, creation timestamp, etc), in addition to an array of tasks.
share|improve this answer
    
I should mention - there's no reason why you couldn't specify a type inside a JSON object, and many applications that save to JSON do just that: the MongoDB C# driver uses a "type discriminant" attribute (called _t) when storing serialized objects so it knows what to deserialize them as. The beauty of JSON is that it is very flexible because it is very simple. –  Nate Barbettini Feb 5 at 2:54
    
Really helpful suggestions, especially about storing metadata for each item. –  neuronet Feb 5 at 15:50

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.