2

data次のjsonデータを逆シリアル化するためのプロパティを定義する方法がわかりません...

{
"response": {
    "total_rows": 39,
    "data": [
      [
        "XXXXXXXXXXXXXXXXXBs2VI",
        "a7ac4aa7-7211-4116-be57-0c36fc2abeee",
        "AAAAAA",
        "Crn Burnley & Victoria St",
        "Richmond",
        "VIC",
        "3121",
        "555-555-555",
        null,
        "Real Estate & Home Improvement > Storage",
        null,
        null,
        -37.8114511488511,
        145.009782837163
      ],
      [ .. ]
      [ .. ]
      ....
    },
    status = "ok"
}

だから私は..

public class ResultData
{
    public Response Response { get; set; }
    public string Status { get; set; }
}

と....

public class Response
{
    public int total_rows { get; set; }
    public IList<string> data { get; set; }
}

しかし、それは例外を投げていました"Can't cast float to string"。そのため、最後の2つのフロートをList<>..に追加しようとしましたが、失敗しました。

どうすればこれを修正できますか?(json出力を制御できません)。

乾杯 :)

アップデート

jsonプロパティのコンテンツは、data固定オブジェクトタイプの固定サイズ配列のようです。では、JSON.NETが正確に逆シリアル化する方法を知っているように.NETコードでそれを定義する方法はありますか?そのjsonプロパティのカスタムjsonデシリアライザーを作成する必要がありますか?

4

4 に答える 4

3

.NET 4.0 を使用しているdynamic場合は、JSON を扱うときに使用することを検討してください。

別の質問でそれを設定する1つの方法を示すコードを投稿しました。

あなたの例では、次のことができます。

var serializer = new JavaScriptSerializer();
serializer.RegisterConverters(new[] { new DynamicJsonConverter() });

dynamic obj = serializer.Deserialize(json, typeof(object));

if (obj.status != "ok")
    throw new OopsException();

int rowCount = obj.total_rows;

foreach (var row in obj.data) {
    string code1 = row[0];
    string code2 = row[1];
    string code3 = row[2];
    string address = row[3];
    string suburb = row[4];
    string state = row[5];
    string postcode = row[6];
    string phone = row[7];
    string something1 = row[8];
    string name = row[9];
    string something2 = row[10];
    string something3 = row[11];
    decimal longitude = row[12];
    decimal latitude = row[13];

    // TODO use above values
}
于 2011-02-21T12:35:36.880 に答える
1

これが最善の方法かどうかはわかりませんが、次のようにすることで機能しました。

public class Response
{
    [JsonProperty(PropertyName = "total_rows")]
    public int TotalRows { get; set; }
    public IList<MyPoco> Data { get; set; }
}

これで、データ プロパティは JSON ライブラリによって自動入力されなくなりますが、これは 100% 問題ありません。

次に、これを行います。

RestResponse<ResultData> response = client.Execute<ResultData>(restRequest);

ResultData data = response.Data;

if (data != null)
{
    // Now the Data property will be null, so we need to parse that badboy.
    JObject linqData = JObject.Parse(response.Content);
    var array = linqData["response"]["data"] as JArray;
    if (array != null)
    {
        data.Response.Data = 
            (from x in array
            select new MyPoco
                        {
                            SubjectKey = x[0].Value<string>(),
                            UUid = x[1].Value<string>(),
                            Name = x[2].Value<string>(),
                            Address = x[3].Value<string>(),
                            City = x[4].Value<string>(),
                            Territory = x[5].Value<string>(),
                            Postcode = x[6].Value<string>(),
                            Telephone = x[7].Value<string>(),
                            Category = x[9].Value<string>(),
                            Website = x[10].Value<string>(),
                            Email = x[11].Value<string>(),
                            Latitude = x[12].Value<float>(),
                            Longitude = x[13].Value<float>()
                        }).ToList();
    }
}

そのため、JSON ライブラリでその 1 つのリスト オブジェクトのリストを自動抽出することはできませんが、Linq-To-Json を使用してそれらの悪者を抽出します。

完全に満足しているわけではありませんが、うまくいきます。

于 2011-02-21T12:28:56.227 に答える
1

配列に文字列と数値があります。リストタイプobjectの has の代わりに使用する必要があります。string

public class Response
{
    public int total_rows { get; set; }
    public IList<object> data { get; set; }
}
于 2011-02-18T14:28:17.800 に答える
0

リストのリストがあるようです。その場合、次のようにする必要があります。

public class Response
{
    public int total_rows { get; set; }
    public IList<IList<object>> data { get; set; }
}
于 2011-02-19T12:42:39.670 に答える