如何使用以_或$开头的变量名称的对象列表反序列化JSON响应

时间:2014-08-03 20:24:31

标签: c# json deserialization system.net.httpwebrequest datacontractjsonserializer

如何反序列出这样的Web响应:

[{"_exp":"2014-06-05T23:58:03.859Z","_id":"123","$val":"dabg"}, 
{"_exp":"2014-07-05T23:58:03.859Z","_id":"143","$val":"dabg"}]

这里我的具体问题是我无法创建一个响应类,其变量名称以$开头,因为C#不支持这种类型的命名约定...

2 个答案:

答案 0 :(得分:2)

您可以手动反序列化到模型类中,允许您将json属性重命名为有效的C#属性。以下是使用JSON.NET的示例。

List<Model> list = new List<Model>();

JArray array = JArray.Parse(json);
foreach (JObject item in array)
{
    list.Add(new Model() {
        Exp = item.Value<DateTime>("_exp"),
        Id = item.Value<int>("_id"),
        Val = item.Value<string>("$val")
    });
}

public class Model
{
    public DateTime Exp { get; set; }
    public int Id { get; set; }
    public string Val { get; set ;}
}

另一种选择是用_val替换$ val。属性名称可以以_开头,因此其他两个有效。这将允许自动反序列化到模型中。添加的引号和冒号将允许它仅定位属性名称"$val":,以便您不会意外地替换属性值。

string newJson = json.Replace("\"$val\":", "\"_val\":");
Model[] models = JsonConvert.Deserialize<Model[]>(newJson);

public class Model
{
    public string _val { get; set; }
    public DateTime _exp { get; set; }
    public int _id { get; set; }
}

答案 1 :(得分:0)

返回Dictionary<string, object>的数组或集合。您可以使用任何您想要的键作为键值,它将根据需要进行序列化/反序列化