2016-04-07 13 views
1

Son birkaç gün içinde bir JSON yanıtı ve C# nesnesinin nasıl serileştirileceği üzerine araştırma yapıyorum. JSON geçerlidir, ancak dönüştürmek için herhangi bir JSON C# dönüştürücüsü alamıyorum. Bu örnek için çalışan Stackoverflow'ta da bir yanıt bulamıyorum. JSON Tepki geçerli: Benim muayene itibarenFarklı veri türleri içeren bir JSON dizisinin tek bir nesneye nasıl dönüştürüleceği

[ 
    { 
    "SEX": "Male", 
    "BREED": "Opifex", 
    "PVPRATING": 1301, 
    "NAME": "Kilmanagh", 
    "FIRSTNAME": "Big", 
    "PVPTITLE": "Freshman", 
    "LASTNAME": "Kahuna", 
    "CHAR_DIMENSION": 5, 
    "ALIENLEVEL": 30, 
    "RANK_name": "Vindicator", 
    "HEADID": 40281, 
    "PROFNAME": "Guru", 
    "LEVELX": 220, 
    "PROF": "Martial Artist", 
    "CHAR_INSTANCE": 12734, 
    "SIDE": "Omni" 
    }, 
    { 
    "ORG_DIMENSION": 5, 
    "RANK_TITLE": "President", 
    "ORG_INSTANCE": 9911, 
    "NAME": "Elements of Destruction", 
    "RANK": 0 
    }, 
    "2016/04/06 08:37:26" 
] 

iki nesneleri ve bir dize içeren bir dizidir. Ben bir nesneye dönüştürmek girişimi için aşağıdaki kullandık: bir hata alıyorum

resultArray = JsonConvert.DeserializeObject<List<JsonWhoisResult>>(data); 
and 
result = JsonConvert.DeserializeObject<JsonWhoisResult>(data); 

Ya yolu:

Error converting value ...(snip)... [ConsoleApplication6.JsonWhoisResult]'. Path '', line 1, position 536.`

Ben nesne yanlış olup olmadığını bilmek ya eğer yok ben Bu JSON biçimi için yanlış kod kullanıyorum. Kullanıyorum:

public class JsonWhoisResult 
{ 
    public stats stats { get; set; } 
    public header header { get; set; } 
    public string datetime { get; set; } 
} 

public class header 
{ 
    public int ORG_DIMENSION { get; set; } 
    public string RANK_TITLE { get; set; } 
    public int ORG_INSTANCE { get; set; } 
    public string NAME { get; set; } 
    public int RANK { get; set; } 
} 

public class stats 
{ 
    public string SEX { get; set; } 
    public string BREED { get; set; } 
    public int PVPRATING { get; set; } 
    public string NAME { get; set; } 
    public string FIRSTNAME { get; set; } 
    public string PVPTITLE { get; set; } 
    public string LASTNAME { get; set; } 
    public int CHAR_DIMENSION { get; set; } 
    public int ALIENLEVEL { get; set; } 
    public string RANK_name { get; set; } 
    public int HEADID { get; set; } 
    public string PROFNAME { get; set; } 
    public int LEVELX { get; set; } 
    public string PROF { get; set; } 
    public int CHAR_INSTANCE { get; set; } 
    public string SIDE { get; set; } 
} 

Herhangi bir çözüm varsa, bunu gerçekten takdir ediyorum. Bu tarz bir stili kullanmam için birkaç tane daha var. Eğer bir çözüm bulabilirsem, onu diğerlerine uygulayabilmem gerekir.

cevap

2

JSON'unuz bir dizi olduğu için tek bir JsonWhoisResult'a dönüşemezsiniz ve dizininizde farklı nesne türleri bulunduğundan, doğrudan bir List<JsonWhoisResult>'a dönüştürebilirsiniz. Bu durumu ele almak için özel bir JsonConverter yapmalısınız. Dönüştürücü, JSON'u seri hale getirmek için Json.Net'in LINQ-to-JSON API'unu kullanabilir, ardından her öğeyi uygun nesne türüne el ile çıkartır ve istediğiniz gibi tek bir JsonWhoisResult doldurur. Böyle bir şey çalışması gerekir:

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

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     JArray array = JArray.Load(reader); 
     JsonWhoisResult result = new JsonWhoisResult(); 
     result.stats = array[0].ToObject<stats>(); 
     result.header = array[1].ToObject<header>(); 
     result.datetime = array[2].ToString(); 
     return result; 
    } 

    public override bool CanWrite 
    { 
     get { return false; } 
    } 

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

Sonra bu gibi kullanmak:

JsonWhoisResult result = JsonConvert.DeserializeObject<JsonWhoisResult>(json, new JsonWhoisResultConverter()); 

Fiddle: https://dotnetfiddle.net/d1hkCn

+0

Hızlı yanıt için teşekkürler! Sonuç: Ek bilgi: JRrayer'dan JArray okunurken hata oluştu. Geçerli JsonReader öğesi bir dizi değil: String. Yol '', satır 1, pozisyon 536. Bu JSON biraz alışılmışın dışında ve beni duvardan kaldırıyor. –

+0

Kontrol edilmesi gerekenler: (1) JSON’unuz soruda olduğu gibi mi yoksa başka bir nesneye mi eklenmiş? İkincisi, dönüştürücü telafi etmek için değiştirilmelidir. (2) DeserializeObject'i tam olarak benim cevabımda gösterildiği gibi mi çağırıyorsunuz? Bu dönüştürücünün çalışması gerektiğini göstermek için bir keman ekledim. Bunu kodunuza göre kontrol edin. –

+0

Brain, JSON aşağıdaki adreslerden gelir: http://people.anarchy-online.com/character/bio/d/5/name/Kilmanagh/bio.xml?data_type=json. Tam JSON'u yapıştırdım. Dotnetfiddle'ın bir çekicilik gibi çalışır. JSON'u indirip JsonConvert.ToString'i kullanarak webclient kullanıyorum. Belki de bu fark yaratıyordur. –

0

Bunu yapmak için dynamic için Json.NET desteğini kullanabilirsiniz. Bu 'u JSON ile'un üzerine yapıştırdığınız gibi test ettim ve işe yarıyor - ama not, bu kesinlikle yazılmadı.

dynamic result = JsonConvert.DeserializeObject(json); 

// value is "Freshman" 
Console.WriteLine("result[0].PVPTITLE = '{0}'", result[0].PVPTITLE); 

// value is "President" 
Console.WriteLine("result[1].RANK_TITLE = '{0}'", result[1].RANK_TITLE); 

// value is 2016-04-06 08:37:27 
Console.WriteLine("result[2] '{0}'", (DateTime)result[2]);