2012-04-03 200 views
13

我在理解如何做到这一点上存在问题,基本上我们有一个API,用户发送一个json格式:(如果代码不完美,请谅解)如何将JSON映射到C#对象

{"Profile": [{ 
      "Name":"Joe", 
      "Last :"Doe", 
      "Client": 
        { 
         "ClientId":"1", 
         "Product":"Apple", 
         "Message":"Peter likes apples" 
         }, 
       "Date":"2012-02-14" 
      }]} 

好吧不知道如果我的JSON格式正确,但现在这是我的问题,我有一个名为Profile的类,其参数Name,Last和一个对象作为其成员之一称为Client以及属性Date。

事情是这样的:

public class Profile 
    { 
    public string Name {get; set;} 
    public string Last {get; set;} 
    public Client client {get; set;} 
    public DateTime dDate {get; set;} 
    } 

所以基本上,我不知道如何抓住JSON,然后将其映射到我的对象......与“帮助”我明白任何帮助将非常感激。

问候

回答

25

您可以使用Json.Ne吨来反序列化JSON字符串(有一些修改你的类)

var yourObject = JsonConvert.DeserializeObject<Root>(jsonstring); 


public class Root 
{ 
    public Profile[] Profile; 
} 

public class Profile 
{ 
    public string Name { get; set; } 
    public string Last { get; set; } 
    public Client Client { get; set; } 
    public DateTime Date { get; set; } 
} 

public class Client 
{ 
    public int ClientId; 
    public string Product; 
    public string Message; 
} 
+0

酷,什么根类的角色?对不起,如果一个新手的问​​题:) – user710502 2012-04-03 07:00:36

+0

因为你的'Profile'数组在一个对象内部(json的根对象没有像xml这样的名字)。我把它命名为'Root',你可以选择任何你想要的名字 – 2012-04-03 07:02:26

+0

哇!........... – 2012-09-04 14:21:51

5

您可以使用JSON库为此,例如Newtonsoft.Json这是免费的。它会自动将json映射到您的类型。

样品:

public static T Deserialize<T>(string json) 
    { 
     Newtonsoft.Json.JsonSerializer s = new JsonSerializer(); 
     return s.Deserialize<T>(new JsonTextReader(new StringReader(json))); 
    } 

还有可用NuGet包。

+0

仅供参考,你也可以将其添加为NuGet包直接在VS,这是很舒服 – Marek 2012-04-03 06:58:09

0

我知道的最简单的方法是使用newtonsoft的JSON.Net。为了便于理解,我总是在C#中使用相同的名称创建匹配的类。 然后它更容易反序列化它。 举个例子,如果它是js中的一个对象数组,它将映射到C#中具有相同名称的对象列表。 至于日期时间,它有点棘手。 Id在服务器端执行客户端验证和Datetime.tryParse,它会照顾破折号或斜线。

var serializer = new JavaScriptSerializer(); 
List<abc> abcList = serializer.Deserialize<List<abc>>(PassedInJsonString);