JavaScriptSerializer.Deserialize - como alterar nomes de campo

ResumoComo faço para mapear um nome de campo em dados JSON para um nome de campo de um objeto .Net ao usar JavaScriptSerializer.Deserialize?

Versão mais longa: Eu tenho os seguintes dados JSON vindo de uma API de servidor (não codificada em .Net)

{"user_id":1234, "detail_level":"low"}

Eu tenho o seguinte objeto C # para isso:

[Serializable]
public class DataObject
{
    [XmlElement("user_id")]
    public int UserId { get; set; }

    [XmlElement("detail_level")]
    public DetailLevel DetailLevel { get; set; }
}

Onde DetailLevel é um enum com "Low" como um dos valores.

Este teste falha:

[TestMethod]
public void DataObjectSimpleParseTest()
{
    JavaScriptSerializer serializer = new JavaScriptSerializer();
    DataObject dataObject = serializer.Deserialize<DataObject>(JsonData);

    Assert.IsNotNull(dataObject);
    Assert.AreEqual(DetailLevel.Low, dataObject.DetailLevel);
    Assert.AreEqual(1234, dataObject.UserId);
}

E as duas últimas afirmações falham, pois não há dados nesses campos. Se eu alterar os dados JSON para

 {"userid":1234, "detaillevel":"low"}

Então passa. Mas eu não posso mudar o comportamento do servidor, e eu quero que as classes do cliente tenham propriedades bem nomeadas no idioma C #. Não consigo usar o LINQ para JSON, pois quero que ele funcione fora do Silverlight. Parece que as tags XmlElement não estão tendo efeito. Eu não sei de onde eu tive a ideia de que eles eram relevantes, eles provavelmente não são.

Como você faz o mapeamento do nome de campo no JavaScriptSerializer? Pode ser feito em tudo?

questionAnswers(8)

yourAnswerToTheQuestion