I think your level file needs to look like this:
{
"MapContent":
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[2,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,1,1],
[2,1,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,2,2],
[2,2,1,1,1,0,0,0,0,1,1,1,2,2,2,1,0,0,0,0,2,2],
[2,2,0,0,0,0,0,0,1,2,2,2,2,2,2,2,1,0,0,0,2,2],
[2,0,0,0,0,0,1,1,2,2,2,2,2,2,2,2,2,1,1,1,2,2],
[2,0,0,0,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2],
[2,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2],
[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2],
[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]
}
Note that I've changed the outer square brackets ([, ]) to curly braces ({, }) because you're deserializing into a JSON object.
It may look a little odd that you have to add the MapContent property to the file but one advantage of this approach is that you'll be able to easily add extra metadata to your map file. For example, you could add a Name property like this:
{
"Name": "My Level",
"MapContent":
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[2,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,1,1],
[2,1,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,2,2],
[2,2,1,1,1,0,0,0,0,1,1,1,2,2,2,1,0,0,0,0,2,2],
[2,2,0,0,0,0,0,0,1,2,2,2,2,2,2,2,1,0,0,0,2,2],
[2,0,0,0,0,0,1,1,2,2,2,2,2,2,2,2,2,1,1,1,2,2],
[2,0,0,0,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2],
[2,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2],
[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2],
[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]
}
And change your MapFile class accordingly
public class MapFile
{
public string Name { get; set; }
public int[,] MapContent { get; set; }
}
Btw, while we are on the topic. I find it very strange that you are passing a MapFile into the MapFile constructor. I think you can remove the constructor completely to simplify the code.
public MapFile(MapFile map)
If you really don't want to change the level format you might be able to change the deserialization method instead. However, I think this approach is going to lead to some pretty confusing code.