2012-05-01 17 views
3

これでいくつか難しいです。Windows Phone 7で配列を含むJSONオブジェクトを解析する

私のJSONは、私はthis tutorialをしようとしましたが、原因別のJSONに、それは働いていなかった

{ "names" : [ {"name":"bla"} , {"name":"bla2"} ] } 

のようなものです。

このメソッドの中には何を入れる必要がありますか? 私のリストを含む、またはJsonObjectを直接使用する「ラップ」クラスを作成する方が良いかどうか分かりません。スニペットを教えてください。私はC#でちょっと新しいです。

void webClient_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e) 
    { 
     DataContractJsonSerializer ser = null; 
     try 
     { 
      ??? 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
    } 

ありがとうございます!

+1

http://json2csharp.com/はあなたの友達になります。 JSONストリングに従ってクラスとメンバーを作成します。それは多くの時間を節約します! – Gero

答えて

6

jsonオブジェクトをマップするクラス。このような何か(私の記憶が正しければ):あなたのイベントハンドラで、その後

/// <summary> 
/// 
/// </summary> 
[DataContract] 
public class Result 
{ 
    /// <summary> 
    /// 
    /// </summary> 
    [DataMember(Name = "name")] 
    public string Name 
    { get; set; } 
} 

/// <summary> 
/// 
/// </summary> 
[DataContract] 
public class Results 
{ 
    /// <summary> 
    /// 
    /// </summary> 
    [DataMember(Name = "names")] 
    public List<Result> Names 
    { get; set; } 
} 

DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(Results)); 
var results = (Results)serializer.ReadObject(SOME OBJECT HOLDING JSON, USUALLY A STREAM); 
+0

-1。 OPはJson.NETを使用していません –

+0

@Mike_G OPは 'DataContractJsonSerializer'も使用しません。私は 'DataContractJsonSerializer ser = null;のみを参照してください'これは** working **コードのdownvoteの唯一の説明ですか? –

+0

はい、うまくいきます!どうもありがとう!誰かが私のような文字列を必要とするならば、obj ["name"]。ToString()を入れてください。おそらくそれは何かの騒ぎですが、私が言ったように、私はC#で新しいです! – Enrichman

1

私は通常JSON.NET(http://james.newtonking.com/projects/json-net.aspx)を使用していますので、コードが多少異なる場合があります。私はそのような名前のプロパティを持つクラスのために行くだろう、リストの内容については

public class NameClass { 
    public string name { get;set; } 
} 

次にあなたがJSON.NETでList<NameClass>をデシリアライズすることができるはずです。

List<NameClass> result = JsonConvert.Deserialize<List<NameClass>>(jsonString); 

この私の頭から書かれているので、コピー&ペーストではコンパイルされませんが、サンプルとして機能するはずです。あなたは.NET DataContractJsonSerializerを使用したタイプセーフな方法

var dict = JsonConvert.DeserializeObject<RootClass>(json); 
foreach (var obj in dict.names) 
{ 
    Console.WriteLine(obj.name); 
} 


public class RootClass 
{ 
    public MyName[] names { get; set; } 
} 

public class MyName 
{ 
    public string name { get; set; } 
} 
+0

-1 OPのJSON文字列が配列またはリストではないため、機能しません。簡単にテストする –

+0

ルートクラスの必要性を監督しました。 @ L.B:これを指摘していただきありがとうございます – Sascha

1

でそれを使用したい場合、または定義する必要があります(Windowsの携帯電話をサポートしています)Json.Net

string json = @"{ ""names"" : [ {""name"":""bla""} , {""name"":""bla2""} ] }"; 

var dict = (JObject)JsonConvert.DeserializeObject(json); 
foreach (var obj in dict["names"]) 
{ 
    Console.WriteLine(obj["name"]); 
} 

を使用して

+0

-1 OPのJSON文字列が配列またはリストではないため、機能しません。簡単にテストできます。 –

+0

もちろん、それは仕事ではなく、そのプログラムではありません。彼はそれが彼のためにやりたいと思っていなかった、彼は次に何をすべきか尋ねた。ご覧のとおり、私は完全に彼の仕事のために2つの主要な要素を実証しました。 Lol、some people .... –

+0

あなたの答えは、OPのjson文字列をルートオブジェクトではなく**リストに非直列化しようとしていました。答えは良い方針です。あなたはそれが実行されることを期待していないので、何もランダムに書き込みます。笑 –

関連する問題