动态处理JSON变量

时间:2014-03-20 02:40:28

标签: c# .net json

你好我有这样的JSON:

simples: {
   EA201SPACC25ANID-126276: {},
   GF867HDKLI25ANID-126309: {},
   RT211YUIAD912IDO-126310: {},
},

变量的名称总是不同的。我们如何声明C#类的模型?顺便说一下,我正在使用JSON.NET

提前致谢

1 个答案:

答案 0 :(得分:2)

如果您的Json结构随时间保持不变

由于您不能拥有EA201SPACC25ANID-126276这样的属性,因此最简单的方法是:

public class MyCustomModel
{
    [JsonProperty("EA201SPACC25ANID-126276")]
    public string Something_1 { get; set; }

    [JsonProperty("GF867HDKLI25ANID-126309")]
    public string Something_2 { get; set; }

    [JsonProperty("RT211YUIAD912IDO-126310")]
    public string Something_3 { get; set; }
}

比你只是反序列化对象:

JsonConver.DeserializeObject<MyCustomModel>(myJsonString);

如果您的Json属性会随着时间的推移而改变(其他名称)

如果是这种情况,您可以选择接收字典或手动绑定字典。对于基本方案,第一个选项应该可以正常工作:

public ActionResult(Dictionary<string, string> model)

但是这种方法在复杂的对象绑定上失败了。为避免这种情况,您可以创建自定义模型绑定器,例如:

public class MyCustomBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var request = controllerContext.RequestContext.HttpContext.Request;
        var dictionary = new Dictionary<string, object>();
        foreach(var item in request.QueryString.Keys.Cast<string>())
        {
            // You might want to cast your data into appropriate types...
            dictionary.Add(item, request.QueryString[item]);
        }
        return dictionary;
    }
}

在您的控制器上,使用:

public ActionResult Index([ModelBinder(typeof(MyCustomBinder))] Dictionary<string, object> model)