2016-04-07 9 views
1

ここ数日、私はJSON応答とC#オブジェクトをどのように逆シリアル化するかを研究してきました。 JSONは有効ですが、変換するためにJSONからC#コンバータを取得することはできません。私はまた、このインスタンスのために働くStackoverflowの答えを見つけることができません。 JSONレスポンスは、次のとおりです。異なるデータ型を含むJSON配列を単一のオブジェクトにデシリアライズする方法

[ 
    { 
    "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" 
] 

私の検査から、2つのオブジェクトと文字列を含む配列です。 私はオブジェクトに変換しようとするために、以下の使用している:私はエラーを取得

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

いずれかの方法:

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

私は、オブジェクトが間違っている場合は知っている場合、またはしていないが、私このJSON形式に間違ったコードを使用しています。私は以下を使用しています:

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; } 
} 

誰かが解決策を持っていれば、本当にありがたいです。私はこのタイプのスタイルを使用するものがいくつかあります。私が解決策を得ることができれば、それを残りの部分に適用できるはずです。

答えて

2

JSONは配列であるため、JsonWhoisResultにデシリアライズできません。配列に異なるオブジェクト型が含まれているため、List<JsonWhoisResult>に直接デシリアライズすることはできません。この状況に対処するには、カスタムJsonConverterを作成する必要があります。コンバーターはJson.NetのLINQ-to-JSON APIを使用してJSONを逆シリアル化し、各アイテムを適切なオブジェクトタイプに手動で抽出し、希望するとおりに1つずつJsonWhoisResultを取り込みます。このような何か作業をする必要があります:

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(); 
    } 
} 

次に、このようにそれを使用します。

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

フィドル:https://dotnetfiddle.net/d1hkCn

+0

お返事ありがとうございました!結果は次のとおりです。追加情報:JsonReaderからJArrayを読み取る際にエラーが発生しました。現在のJsonReaderアイテムは配列ではありません:String。 Path ''、1行目、536位です。このJSONはちょっとしたもので、私を壁に追い込んでくれます。 –

+0

確認事項:(1)あなたのJSONは質問に投稿されたものと同じですか、別のオブジェクトにラップされていますか?後者の場合は、コンバータを修正して補正する必要があります。 (2)私の答えに示されているようにDeserializeObjectを正確に呼びますか?このコンバータが動作することを示すために私はフィドルを追加しました。それをあなたのコードと照合してください。 –

+0

Brain、JSONはhttp://people.anarchy-online.com/character/bio/d/5/name/Kilmanagh/bio.xml?data_type=jsonから来ています。私は正確なJSONを貼り付けました。あなたのdotnetfiddleは魅力のように動作します。 JSONをダウンロードしてからJsonConvert.ToStringを使用してwebclientを使用しています。多分それが違いを生み出しているのかもしれません。 –

0

あなたがこれを行うにはdynamicためJSON.netのサポートを使用することができます。私はこのをJSONでテストしたところ、の上にペーストしていますが、これは機能しますが、これは強く型付けされているわけではありません。

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]); 
関連する問題