If you're after a lightweight, no-added-references kind of approach, maybe this bit of code I just wrote will work (I can't 100% guarantee robustness though).
using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;
public Dictionary ParseJSON(string json)
{
int end;
return ParseJSON(json, 0, out end);
}
private Dictionary ParseJSON(string json, int start, out int end)
{
Dictionary dict = new Dictionary();
bool escbegin = false;
bool escend = false;
bool inquotes = false;
string key = null;
int cend;
StringBuilder sb = new StringBuilder();
Dictionary child = null;
List
[I realise that this violates the OP Limitation #1, but technically, you didn't write it, I did]