JavaScriptSerializer.Deserialize - как изменить имена полей

Summary: Как сопоставить имя поля в данных JSON с именем поля объекта .Net при использовании JavaScriptSerializer.Deserialize?

Longer version: У меня есть следующие данные JSON, поступающие ко мне из серверного API (не закодировано в .Net)

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

У меня есть следующий объект C # для этого:

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

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

Где DetailLevel - это перечисление с «Низким»; как одно из значений.

Этот тест не проходит:

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

И последние два утверждения не выполняются, поскольку в этих полях нет данных. Если я изменю данные JSON на

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

Тогда это проходит. Но я не могу изменить поведение сервера, и я хочу, чтобы у клиентских классов были хорошо названные свойства в идиоме C #. Я не могу использовать LINQ to JSON, поскольку хочу, чтобы он работал вне Silverlight. Похоже, что теги XmlElement не имеют никакого эффекта. Я не знаю, откуда у меня появилась идея, что они вообще имеют отношение к делу, скорее всего, это не так.

Как вы делаете сопоставление имен полей в JavaScriptSerializer? Можно ли это сделать вообще?

Ответы на вопрос(8)

Ваш ответ на вопрос