2

以下のJSONリターンから数値距離「値」にアクセスするのに時間がかかります。JSON.NET3.5ライブラリを使用しています。プログラムは次のように終了します。

コンパイラエラーメッセージ:CS0119:'System.Xml.Linq.Extensions.Elements(System.Collections.Generic.IEnumerable、System.Xml.Linq.XName)'は'メソッド'であり、指定されたコンテキストでは無効です

ソースエラー:

Line 64: GeoElements Elements =     JsonConvert.DeserializeObject<GeoElements>geoResponse.ToString());
Line 65: 
Line 66: count2 = geoResponse.Elements.Length;
Line 67: for (int j = 0; j < count2; j++)
Line 68: {

次に、JSONリターンとそれに続くC#コードビハインドを示します。

 {
    "destination_addresses" : [ "3095 E Patrick Ln, Las Vegas, NV 89120, USA" ],
    "origin_addresses" : [ "Vegas @ Advanced Tech Academy (E), Las Vegas, NV 89106, USA" ],
    "rows" : [
       {
          "elements" : [
             {
                "distance" : {
                   "text" : "13.4 mi",
                   "value" : 21573
                },
                "duration" : {
                   "text" : "24 mins",
                   "value" : 1429
                },
                "status" : "OK"
             }
          ]
       }
    ],
    "status" : "OK"
 }

            public partial class maproute : System.Web.UI.Page
{ 

    public class GeoDistance
    {
        public string value { get; set; }
        public string text { get; set; }
    }
    public class GeoElements
    {
        public GeoDistance distance { get; set; }
    }

    public class GeoResult        
    {
        public GeoElements[] Elements { get; set; }             
    }         
    public class GeoResponse       
    {            
        public string Status { get; set; }           
        public GeoResult[] Rows { get; set; }
    } 


    public int parseDistance(string stream)
    {
        //process response file
        GeoResponse geoResponse = JsonConvert.DeserializeObject<GeoResponse>(stream);
        int dist = 0;
        int count = 0;
        int count2 = 0;
        try
        {
        if (geoResponse.Status == "OK")
        {
            count = geoResponse.Rows.Length;
            for (int i = 0; i < count; i++)
            {
                GeoElements Elements = JsonConvert.DeserializeObject<GeoElements>(geoResponse.ToString());

                count2 = geoResponse.Rows[i].Elements.Length;
                for (int j = 0; j < count2; j++)
                {
                    dist = geoResponse.Rows[i].Elements[j].distance.value;

                    //dist = dist/1609.3;  
                } 

                //dist = dist/1609.3;  
            }   

        }  

            //    dist = 4;  
        }
        catch(Exception ex)
        {
            Response.Write("DEBUG: ");
            Response.Write("Status: " + geoResponse.Status);
            Response.Write("</br>");
            Response.Write("Results: " + geoResponse.Rows.Length);
            Response.Write("</br>");                
        }
        return dist;

    }
4

3 に答える 3

1

要素は JSON の配列ですが、クラスでは単一の値であるため、配列にすることで機能するはずです。

public GeoElements[] elements { get; set; } 
于 2012-06-01T21:17:02.273 に答える
1

逆シリアル化された型は、配列であるか、IEnumerable、ICollection、IList などのコレクション インターフェイスを実装する必要があります。

GeoElements缶に書かれていることとまったく同じことを行います。JSON を逆シリアル化するには、配列が必要です。あなたGeoElementのコードは単一の値です。これは、json の配列です。IList/ICollectionしたがって、クラスでインターフェイスを継承するかGeoElement、GeoElement を GeoElements の配列として宣言します。

class GeoElement : ICollection { ... }

また

GeoElement[] elements = JSONConverter.Deserialize(stream);
于 2012-06-01T21:37:24.873 に答える
1

最後に問題を見つけました。クラスの定義が間違っていました。http://json2csharp.com/が見つかりました。Google から取得した JSON データをボックスにドロップするだけで、適切なクラス構造が生成されました。

于 2012-06-26T21:04:17.233 に答える