2

今、私はこの JSON を持っています:

[
    "bekasi",
    "bekasi barat",
    "bekasi selatan",
    "bekasi timur",
    "bekasi utara",
    "serang bekasi"
]

パーサークラスの作り方がわかりません。オンライン json を c# クラス ジェネレーターに試してみましたが、役に立ちません。だから私はこれを試しました:

[DataContract]
public class kota
{
    [DataMember]
    public string kotanya { get; set; }

}

この

public static kota eks; // I also tried  public static kota[] eks;

public void mulai()
    {
        string eksp = "http://www.ongkoskirim.com/api/0.2/?id=OAL66afd139a386fee6dc5a5597abd7daba&q=city&s=bek";

        WebClient client = new WebClient();
        client.OpenReadCompleted += new OpenReadCompletedEventHandler(client_OpenReadCompleted);
        client.OpenReadAsync(new Uri(eksp), UriKind.Absolute);
    }

    void client_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
    {
        try
        {
            var ser = new DataContractJsonSerializer(typeof(kota)); //and I have tried typeof(IEnumerable<kota>) 
            System.Diagnostics.Debug.WriteLine("sini");
            eks = (kota)ser.ReadObject(e.Result); //I also tried (kota[])ser.ReadObject(e.Result);
            System.Diagnostics.Debug.WriteLine("sana");
            List<string> temp = new List<string>();
            temp.Add("Semua");
            System.Diagnostics.Debug.WriteLine("list");
            for (int i = 0; i < 3; i++)
            {
                System.Diagnostics.Debug.WriteLine(eks.kotanya[i]);

            }

        }
        catch (Exception ex)
        {

            System.Diagnostics.Debug.WriteLine(ex.Message);
            System.Diagnostics.Debug.WriteLine(ex.StackTrace);
        }
    }

しかし、私は常にinvalidCastExceptionを取得しています。誰でも私を助けることができますか?

4

3 に答える 3

1

JSON は文字列の単純な配列であるため、追加のクラスは必要ありません。

var ser = new DataContractJsonSerializer(typeof(string[]));
var items = (string[]) ser.ReadObject(e.Result);

JSON がより複雑になるまで、専用のクラスは使用しませんが、kotaインスタンスのリストを簡単に作成できます。

var kotas = items.Select(i => new kota { kotanya = i }).ToList();

余談ですが、JSON のデシリアライゼーションをさらに行う予定がある場合は、JSON.NET ライブラリを参照することをお勧めします。

于 2012-12-16T10:35:51.140 に答える
0

クラスを操作する必要がある場合は、プロパティを文字列のコレクションとJSON文字列に変更してkotaクラスを変更する必要があります(文字列のコレクションを説明するデータメンバーの名前を追加し、文字列を囲みます) 。 :kotanyakotanya{}

static void Main(string[] args)
{
    string json = "{\"kotanya\":[\"bekasi\",\"bekasi barat\",\"bekasi selatan\",\"bekasi timur\",\"bekasi utara\",\"serang bekasi\"]}";

    var s = new DataContractJsonSerializer(typeof(kota));
    using (var m = new MemoryStream(Encoding.ASCII.GetBytes(json)))
    {
        var r = s.ReadObject(m);

    }
}

[DataContract]
public class kota
{
    [DataMember]
    public string[] kotanya { get; set; }

}
于 2012-12-16T10:44:05.217 に答える
0

シリアライズしたい配列なので、これを試してみてください

 var ser = new DataContractJsonSerializer(typeof(kota[]));
于 2012-12-16T10:35:10.133 に答える