0

編集:問題なく逆シリアル化できることがわかりました。問題は、実際にループして質問を取得しようとしたときです。「オブジェクト参照がオブジェクトのインスタンスに設定されていません」と同じエラーが発生します。回答があるので投稿を削除できないため、これを編集しているだけです。

            //deserialize json
            ResponsesList responses = JsonConvert.DeserializeObject<ResponsesList>(_ResponseContent);

            if (responses != null)
            {
                //loop through responses
                foreach (ResponsesList.Data data in responses.data)
                    foreach (ResponsesList.Questions question in data.questions)
                        foreach (ResponsesList.Answer answer in question.answers)
                        {
                            //upsert each response
                            UpsertResponse(survey_id, data.respondent_id, question.question_id, answer.row, answer.col);
                        }
            }

この行はエラーが発生する場所です

foreach (ResponsesList.Questions question in data.questions)

ここに私がデシリアライズしているクラスがあります

    //get_responses
    public class ResponsesList
    {
        public int status { get; set; }
        public List<Data> data { get; set; }

        public class Data
        {
            public string respondent_id { get; set; }
            public List<Questions> questions { get; set; }
        }

        public class Questions
        {
            public List<Answer> answers { get; set; }
            public string question_id { get; set; }
        }

        public class Answer
        {
            public string row { get; set; }
            public string col { get; set; }
        }

    }
4

4 に答える 4

1

理解した。ループしようとしていたオブジェクトがnullでないことを確認するために、いくつかのチェックを入れる必要がありました。

例:

            //deserialize json
            ResponsesList responses = JsonConvert.DeserializeObject<ResponsesList>(_ResponseContent);

            if (responses != null)
            {
                //loop through responses
                foreach (ResponsesList.Data data in responses.data)
                    if (data != null)
                    {
                        foreach (ResponsesList.Questions question in data.questions)
                            if (question != null)
                            {
                                foreach (ResponsesList.Answer answer in question.answers)
                                {
                                    //upsert each response
                                    UpsertResponse(survey_id, data.respondent_id, question.question_id, answer.row, answer.col);
                                }
                            }
                    }
            }

でも、みんなの反応に感謝します。

于 2013-11-22T19:18:09.670 に答える
1

LINQPad でサンプル文字列を正常に逆シリアル化しました。

var str = 
@"{
    ""status"": 0,
    ""data"": [
        null,
        null
    ]
}";
JsonConvert.DeserializeObject<ResponsesList>(str).Dump();

これは、あなたの _ResponseContent があなたが思っているものではないことを示しています。

于 2013-11-22T16:52:16.717 に答える
0

このエラーが発生したとき、ループを実行する前に null のテストを追加して修正しました。

于 2014-11-17T18:42:09.740 に答える
-1

このサイトを使用してクラスを作成します: http://json2csharp.com/

これはそれが吐き出したものです:

public class RootObject
{
    public int status { get; set; }
    public List<object> data { get; set; }
}
于 2013-11-22T16:43:50.390 に答える