2011-10-04 11 views
5

Bir nesne hiyerarşisine bir json dizesini ayrıştırmak için DataContractJsonSerializer kullanıyorum. json dize şöyle görünür: Eğer "nitelikleri" nin alt değerini görebileceğiniz gibiC# DataContractJsonSerializer değeri bir dizi veya tek bir öğe olduğunda başarısız olursa

{ 
    "groups": [ 
     { 
      "attributes": [ 
       { 
        "sortOrder": "1", 
        "value": "A" 
       }, 
       { 
        "sortOrder": "2", 
        "value": "B" 
       } 
      ] 
     }, 
     { 
      "attributes": { 
       "sortOrder": "1", 
       "value": "C" 
      } 
     } 
    ] 
} 

bir dizi veya tek bir öğe olabilir.

[DataContract] 
public class ItemGroup 
{ 
    [DataMember(Name="attributes")] 
    public List<DetailItem> Items { get; set; } 
} 

Bu ilk biri için çalışıyor ama ikinci birinde başarısız: Sorun occures kod parçasını buldum.

Bunun için herhangi bir cevap var mı?

+0

Json neden bu kadar tutarsız? kaynağında tamir mümkün olur mu? –

+0

Bu nasıl başarısız? Ne hata? – bryanmac

cevap

3

JSON sadece bir eleman içerse bile o zaman niteliklerini emin olun bir dizi olduğunu nasıl oluşturulduğunu kontrol ederse Thx. Sonra ikinci eleman bu şekilde görünecek ve iyi ayrışacaktır.

3

Daniel'in dediği gibi, Json'un oluşturulmasını kontrol edebilecek olursanız, bu şekilde devam etmek daha iyidir. Ama, o zaman Json.Net kütüphanesini & kullanabilirsiniz olamazsa gibi this bağlantısından JSONObject nesnesi sınıfı bazı kod yazmak:

JObject o = (JObject)JsonConvert.DeserializeObject(input); 
dynamic json = new JsonObject(o); 
foreach (var x in json.groups) 
{ 
     var attrs = x.attributes; 
     if (attrs is JArray) 
     { 
      foreach (var y in attrs) 
      { 
       Console.WriteLine(y.value); 
      } 
     } 
     else 
     { 
      Console.WriteLine(attrs.value); 
     } 
} 
+0

Bu iyi bir fikir +1 –

1

Bu DataContractJsonSerializer, JavaScriptSerializer ve JSON ile çalışan almaya çalıştı .Net ve hiçbiri, tüm durumlarda başarılı bir şekilde doğrudan bir nesneye serileştirirdi. Dinamikler ve ekstra JsonObject sınıfı kullanılmasa da, JSON.Net kullanarak benzer bir yaklaşım kullandım. senaryonuz için kodumu uyarlama aşağıdaki gibi görünecektir: JSON.Net bunun bir istisna atma yerine tek öğe ile bir koleksiyona deserialization zorlamak için izin vermek için

private List<ItemGroup> ParseItemGroupList(string input) 
    { 
     JObject json = JObject.Parse(input); 

     List<ItemGroup> groups = new List<ItemGroup>(); 
     JArray gArray = json["groups"] as JArray; 
     foreach (var gToken in gArray) 
     { 
      ItemGroup newGroup = new ItemGroup(); 
      JToken attrToken = gToken["attributes"] as JToken; 
      if (attrToken is JArray) 
      { 
       newGroup.Items = attrToken.Children().Select(MapDetailItem()).ToList(); 
      } 
      else 
      { 
       newGroup.Items = new List<DetailItem>() { MapDetailItem().Invoke(attrToken) }; 
      } 

      groups.Add(newGroup); 
     } 

     return groups; 
    } 

    private static Func<JToken, DetailItem> MapDetailItem() 
    { 
     return json => new DetailItem 
     { 
      SortOrder = (string)json["sortOrder"], 
      Value = (string)json["value"] 
     }; 
    } 

Umarım, birileri bir ayar ekleyecektir. JSON'un yalnızca otomatik olarak doğru ayrılmayan küçük bir kısmı olduğunda, tüm ayrıştırma işlemlerini elle yapmanız gereken bir utançtır.

İlgili konular