2014-04-06 157 views
0

我不能爲我的生活弄清楚如何讓這個JSON反序列化成我可以在代碼中使用和讀取的東西。我創建了一個類,並在每個屬性上使用JsonProperty來處理json名稱中句號的無效使用。但我無法弄清楚如何創建根對象。帶數字的屬性是隨機的,生活在字典中。但recsindb和recsonpage是靜態名稱。反序列化奇數JSON字典

{ 
    "1": { 
     "orders.orderid":"538", 
     "entity.customerid":"109", 
     "entity.entityid":"538", 
    }, 
    "2": { 
     "orders.orderid":"536", 
     "entity.customerid":"108", 
     "entity.entityid":"536", 
    }, 
    "recsindb":"2", 
    "recsonpage":"2" 
} 
+0

的可能重複的[REST API的包裝設計:返回動態JSON作爲JSON.NET JObject/JArray](http://stackoverflow.com/questions/22879772/rest-api-wrapper-design-returning-dynamic-json-as-json-net-jobject -jarray) –

+0

我已經標記爲可能的重複問答我幾天前回答。標題是不同的,但它也是你的一個可能的解決方案! –

+0

@MatíasFidemraizer這不像是另一個問題,沒有什麼是像其他問題那樣高度動態。這是一個與屬性混合的字典之間的問題。布賴恩的答案實際上完美地擊中了頭部。 –

回答

1

您可以使用自定義JsonConverter來處理這種情況。
定義你的數據類是這樣的:

[JsonConverter(typeof(CustomConverter))] 
public class RootObject 
{ 
    public Dictionary<string, Order> Orders { get; set; } 
    public string RecsInDB { get; set; } 
    public string RecsOnPage { get; set; } 
} 

public class Order 
{ 
    [JsonProperty("orders.orderid")] 
    public string OrderID { get; set; } 

    [JsonProperty("entity.customerid")] 
    public string CustomerID { get; set; } 

    [JsonProperty("entity.entityid")] 
    public string EntityID { get; set; } 
} 

創建一個自定義的轉換器來處理根對象是這樣的:

class CustomConverter : JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     return (objectType == typeof(RootObject)); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     JObject jo = JObject.Load(reader); 
     RootObject obj = new RootObject(); 
     obj.RecsInDB = jo["recsindb"].ToString(); 
     obj.RecsOnPage = jo["recsonpage"].ToString(); 
     obj.Orders = new Dictionary<string, Order>(); 
     foreach (JProperty prop in jo.Properties()) 
     { 
      if (prop.Name != "recsindb" && prop.Name != "recsonpage") 
      { 
       obj.Orders.Add(prop.Name, prop.Value.ToObject<Order>()); 
      } 
     } 
     return obj; 
    } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    } 
} 

然後你就可以反序列化這樣的:

RootObject obj = JsonConvert.DeserializeObject<RootObject>(json); 

現在您可以像平常一樣使用數據類。這裏是一個演示:

class Program 
{ 
    static void Main(string[] args) 
    { 
     string json = @" 
     { 
      ""1"": { 
       ""orders.orderid"":""538"", 
       ""entity.customerid"":""109"", 
       ""entity.entityid"":""538"", 
      }, 
      ""2"": { 
       ""orders.orderid"":""536"", 
       ""entity.customerid"":""108"", 
       ""entity.entityid"":""536"", 
      }, 
      ""recsindb"":""2"", 
      ""recsonpage"":""2"" 
     }"; 

     RootObject obj = JsonConvert.DeserializeObject<RootObject>(json); 

     Console.WriteLine("RecsInDB: " + obj.RecsInDB); 
     Console.WriteLine("RecsOnPage: " + obj.RecsOnPage); 
     foreach (var kvp in obj.Orders) 
     { 
      Console.WriteLine("Order #" + kvp.Key); 
      Console.WriteLine(" OrderID " + kvp.Value.OrderID); 
      Console.WriteLine(" CustomerID " + kvp.Value.CustomerID); 
      Console.WriteLine(" EntityID " + kvp.Value.EntityID); 
     } 
    } 
} 

輸出:

RecsInDB: 2 
RecsOnPage: 2 
Order #1 
    OrderID 538 
    CustomerID 109 
    EntityID 538 
Order #2 
    OrderID 536 
    CustomerID 108 
    EntityID 536 
+0

工作完美,謝謝。我唯一不同的做法是讓Orders成爲RootObject的一個屬性,我從Dictionary 繼承了RootObject,並將訂單添加到RootObject。 –

+0

沒問題;樂意效勞。 –