2013-07-10 43 views
6

我有以下的JSON從遠程API回來(我不能修改JSON返回)JSON.Net轉換內部對象爲C#型號

{ 
    "APITicket": { 
     "location": "SOMEVALUE", 
     "ticket": "SOMEVALUE" 
    } 
} 

現在使用JSON.Net轉換成這一個模型我必須創建2個模型。

public class TicketModel 
    { 
     public string location { get; set; } 
     public string ticket { get; set; } 
    } 

    public class TicketContainer 
    { 
     public TicketModel APITicket { get; set; } 
    } 

,做一些如..

var myObject = JsonConvert.DeserializeObject<TicketContainer>(this.JSONResponse); 

,這工作得很好 - 當我有大約50個電話要對API和真的不花哨創建第二個「集裝箱」我的問題出現每。有沒有辦法將上面的例子直接綁定到TicketModel?

+0

如果需要每個API調用之間deserialise在那麼就真的沒有辦法在這附近。在50個API調用返回後,您可以批量反序列化。 –

+0

Hi @SamLeach嗨@SamLeach我有50個不同的API調用,所以它不是一個調用的數量,但更多的是創建容器模型的痛苦,只是對反序列化沒有用處! – LiamB

回答

1

你可以這樣來做:

 var json = @" 
        { 
         'APITicket': { 
          'location': 'SOMEVALUE', 
          'ticket': 'SOMEVALUE' 
         } 
        }"; 

     //Parse the JSON: 
     var jObject = JObject.Parse(json); 

     //Select the nested property (we expect only one): 
     var jProperty = (JProperty)jObject.Children().Single(); 

     //Deserialize it's value to a TicketModel instance: 
     var ticket = jProperty.Value.ToObject<TicketModel>(); 
1

修改JSON,所以它看起來像這樣

{ 
    "location": "SOMEVALUE", 
    "ticket": "SOMEVALUE" 
} 

,做

List<TicketModel> tickets = JsonConvert.DeserializeObject<List<TicketModel>>(this.JSONResponse); 

甚至

Dictionary<string, string> tickets = JsonConvert.DeserializeObject<Dictionary<string, string>>(this.JSONResponse); 

,所以你不需要任何車型。

+0

嗨,山姆,我不能修改JSON,因爲它是一個外部API。 - 更新了問題以澄清。 – LiamB

+0

爲什麼不呢?如果它返回Json,你可以用它做你想做的事。 –

1

使用Newtonsoft's JArray定製UR JSON反序列化之前

public List<APITicket> JsonParser(string json) 
    { 
     Newtonsoft.Json.Linq.JArray jArray = Newtonsoft.Json.Linq.JArray.Parse(json); 

     var list = new List<APITicket>(); 

     foreach(var item in jArray) 
     { 
      list.Add(
       new APITicket { location = item["APITicket"]["location"], 
           ticket = item["APITicket"]["ticket"]    
       } 
      ); 
     } 
     return list; 
    }