将多个Json对象反序列化为各自的类型

时间:2015-07-20 13:58:47

标签: c# asp.net-web-api

我有一个不同类型的Json发布到我的服务中。

var postedJson = [
    { "firstName":"John", "lastName":"Doe" },
    { "fruit":"apple", "Available":"false" },
    { "length":100, "width":60, "height":30 },
    { "firstName":"Shivang", "lastName":"Mittal" }
]

我在服务端有相同类型的模型,如何创建一个通用的方法来接收数据,然后根据它们的类型对它进行反序列化。

现在我正在按照下面这样做

public void SaveData(MasterModel data)

public class MasterModel 
{
    public PersonInfo Person{get; set;}
    public DimensionInfo Dimension{get; set;}
}

我想将此SaveData设为通用,以便每当有人调用该服务时,它会自动匹配相应的类型并与模型绑定。 有没有好办法呢

1 个答案:

答案 0 :(得分:2)

首先建议的事情很少。

  1. 将JSON格式更改为更易解析。示例:http://codebeautify.org/jsonviewer/71f495

  2. 大写字母也是一个好主意,因为这些属性转换为强类型属性。

  3. .NET Fiddle

    主要

    string json = "[  {    \"Name\": {      \"FirstName\":\"John\",      \"LastName\":\"Doe\"    },    \"Fruit\": {      \"Fruit\":\"apple\",      \"Available\":\"false\"    },    \"Dimensions\": {      \"Length\": 100,      \"Width\": 60,      \"Height\": 30    }  }  , {    \"Name\": {      \"firstName\":\"Shivang\",      \"lastName\":\"Mittal\"    },    \"Fruit\": {      \"Fruit\":\"orange\",      \"Available\":\"true\"    },    \"Dimensions\": {      \"Length\": 120,      \"Width\": 40,      \"Height\": 10    }  }]";
    
    var model = new Model();
    // Here is the magic happening, thanks to `Newtonsoft.Json`
    model.Peoples = JsonConvert.DeserializeObject<List<Person>>(json);
    

    <强>实体

    public class Model
    {
        public List<Person> Peoples { get; set; }
    }
    
    public class Person
    {
        public Name Name { get; set; }
        public Fruit Fruit { get; set; }
        public Dimensions Dimensions { get; set; }
    }
    
    public class Name
    {
        public string FirstName { get; set; }   
        public string LastName { get; set; }
    }
    
    public class Fruit
    {
        public string Type { get; set; }    
        public bool Available { get; set; }
    }
    
    public class Dimensions
    {
        public int Length { get; set; } 
        public int Height { get; set; }
        public int Width { get; set; }
    }