JavaScriptSerializer.Deserialize - cómo cambiar los nombres de campo

Resumen: ¿Cómo asigno un nombre de campo en datos JSON a un nombre de campo de un objeto .Net cuando uso JavaScriptSerializer.Deserialize?

Versión más larga: Tengo los siguientes datos JSON procedentes de una API de servidor (no codificados en .Net)

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

Tengo el siguiente objeto C # para ello:

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

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

Donde DetailLevel es una enumeración con "Bajo" como uno de los valores.

Esta prueba falla:

[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);
}

Y las dos últimas afirmaciones fallan, ya que no hay datos en esos campos. Si cambio los datos JSON a

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

Entonces pasa. Pero no puedo cambiar el comportamiento del servidor, y quiero que las clases de clientes tengan propiedades bien nombradas en el lenguaje C #. No puedo usar LINQ to JSON ya que quiero que funcione fuera de Silverlight. Parece que las etiquetas XmlElement no tienen ningún efecto. No sé de dónde obtuve la idea de que eran relevantes, probablemente no lo sean.

¿Cómo se hace la asignación de nombre de campo en JavaScriptSerializer? ¿Se puede hacer en absoluto?

Respuestas a la pregunta(8)

Su respuesta a la pregunta