0

JSON 配列オブジェクトを読み取ろうとすると、問題が発生します。

PHPを使用してJSONデータを作成しています。

if (mysql_num_rows($result) > 0) {
    // looping through all results
    // products node
    $response["records"] = array();
    //$response["products"] = array();

    while ($row = mysql_fetch_array($result)) 
    {
        // temp user array
        $record = array();
        $record["vehicleNo"] = $row["vehicleNo"];
        $record["vehicleType"] = $row["vehicleType"];
        $record["inTime"] = $row["inTime"];
        $record["outTime"] = $row["outTime"];
        $record["entryUser"] = $row["entryUser"];

        // push single record into final response array
        array_push($response["records"], $record);
    }

    // success
    $response["success"] = 1;

    // echoing JSON response
    echo json_encode($response);
}

上記のコードは、次の JSON を返します。

{"records":[{"vehicleNo":"6545","vehicleType":"Bike","inTime":"2013-08-01 18:11:20","outTime":"2013-08-01 19:27:55","entryUser":"srini"}],"success":1}

次のコードを使用して JSON を解析しています。

var rootObject = JsonConvert.DeserializeObject<MyBookList>(e.Result);

Console.WriteLine(rootObject.success);
MessageBox.Show(rootObject.success.ToString());
foreach (var re in rootObject.recordsss)//
{
    Debug.WriteLine(re.value_record);
    MessageBox.Show(re.value_record);
}

public class MyBookList
{
    public string success { get; set; }
    public MyRecords[] recordsss { get; set; }
}

public class MyRecords
{
    public string value_record { get; set; }
}

ただし、「オブジェクト参照がオブジェクトのインスタンスに設定されていません」というエラーがスローされます。

この問題を解決し、JSON データを適切に読み取るにはどうすればよいですか。

4

1 に答える 1

2

問題は、クラスが JSON データと一致しないことです。一致する必要があります。そうしないと、Json.NET は値を設定できず、null のままになります。これが、表示されているエラーの最も可能性の高い原因です。

クラスを次のように作成してみてください。

public class RootObject
{
    public int success { get; set; }
    public List<Record> records { get; set; }
}

public class Record
{
    public string vehicleNo { get; set; }
    public string vehicleType { get; set; }
    public string inTime { get; set; }
    public string outTime { get; set; }
    public string entryUser { get; set; }
}

次に、それを逆シリアル化して、次のように読み取ることができます。

var rootObject = JsonConvert.DeserializeObject<RootObject>(e.Result);

Console.WriteLine("success = " + rootObject.success);
foreach (var re in rootObject.records)
{
    Debug.WriteLine("vehicleNo = " + re.vehicleNo);
    Debug.WriteLine("vehicleType = " + re.vehicleType);
    Debug.WriteLine("inTime = " + re.inTime);
    Debug.WriteLine("outTime = " + re.outTime);
    Debug.WriteLine("entryUser = " + re.entryUser);
}
于 2013-08-03T08:34:08.413 に答える