2

多次元の JSON 文字列をアプリケーションに解析しようとしています。文字列の一部を次に示します。

{"one": {"Title": "There Goes the Musical Neighborhood", "Body": "4 月 18 日 Public Enemy..."},"two": {"Title": "Public Enemys DJ Lord Tours Australia ", "本文": "公共の敵...

ご覧のとおり、キー ("one") の値が 2 番目の JSON 文字列に設定されており、キーは "title" と "body" で始まり、それぞれに独自の文字列値があります。

文字列を出力するために使用する私の Web サービスは、単一のキーと値のペアで正常に解析されます (例: {"タイトル": "そこに行くミュージカル ネイバーフッド"、"本文": "4 月 18 日公共の敵..."} Json.Netを使用していて、キーとクラスメンバーを簡単にペアリングできるため、文字列を解析して作成したクラスに保存します。

ここで、最大 5 つの文字列 (必ずしもすべてではない) をアプリケーションに解析して、ユーザーに出力する必要があります。

最初に、最初の配列 (例: {"one": {"Title": ...) から各値を解析しようとしました。これにより、格納される文字列は、独自のオブジェクトに解析できる単一の JSON 文字列になりますが、コードを実行すると、予期しないトークン「1」でエラーが返されるようです。

これが私がこれを解析している方法です。

        var request = HttpWebRequest.Create(string.Format(@"http://moon.eastlink.com/~jandrews/webservice2.php"));

        request.ContentType = "application/json";

        request.Method = "GET";



        using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)

        {

            if (response.StatusCode != HttpStatusCode.OK)

                Console.Out.WriteLine("Error fetching data. Server returned status code: {0}", response.StatusCode);

            using (StreamReader reader = new StreamReader(response.GetResponseStream()))

            {

                var content = reader.ReadToEnd();

                if(string.IsNullOrWhiteSpace(content)) {

                    Console.Out.WriteLine("Response contained empty body...");

                }

                else {

                    Console.Out.WriteLine("Response Body: \r\n {0}", content);



                    NewsArray news = JsonConvert.DeserializeObject<NewsArray>(content);

オブジェクトを逆シリアル化する前の私の応答は、文字列全体が正常で、コンソールに 1 つずつ出力されるため、ストリーム リーダーが文字列を取得していることがわかります。ただし、オブジェクトを逆シリアル化しようとすると、「行 1 位置 9 のトークンが無効です」というエラーが表示されます。文字列ブラケットをエスケープする方法に関係している可能性がありますが、オンライン パーサーでは問題なく動作しました。このサイトは私の完全な文字列がある場所なので、見てみることができます. 何が間違っているのか、またはこれについてより良い方法があるかどうか、何か考えはありますか?

4

2 に答える 2

-1

使用している.NETのバージョンによっては、次のようなものを使用できます

using System.Runtime.Serialization.Json;
public static T JsonDeserializer<T>(string jsonString)
    {
        DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
        MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));

        T obj = (T)ser.ReadObject(ms);
        return obj;
    }

次に、その関数を使用して、型が何であれジェネリック型として渡します

于 2013-06-14T18:56:00.317 に答える