Десериализация подобъекта JSon с помощью NewtonSoft - PullRequest
0 голосов
/ 07 августа 2020

Я новичок в NewtonSoft и пытаюсь десериализовать объект, содержащий подчиненный объект, но при десериализации я получаю нулевой объект в моем подобъекте ...

Мой Json это:

"{\"id\":\"5e6106600066d227a231ceb8\",\"complete\":null,\"questions\":{\"5e60af61a7be775b0d31ea77\":{\"timeStamp\":\"2020-03-05T15:01:56.000000Z\",\"choices\":[\"dsbb\"]},\"5e60af66a7be775b0d31ea78\":{\"timeStamp\":\"2020-03-05T15:02:02.000000Z\",\"choices\":[\"9999999999\"]},\"5e60af76dd15333d1727ce09\":{\"timeStamp\":\"2020-03-05T15:02:11.000000Z\",\"choices\":[\"lj@test.com\"]},\"5e60afeeb406ed608058d045\":{\"timeStamp\":\"2020-03-05T15:02:15.000000Z\",\"choices\":[0]},\"5e5d282331808f44ce4b0b76\":{\"timeStamp\":\"2020-03-05T15:02:22.000000Z\",\"choices\":[0]},\"5e5cec17ae23a40b0c645614\":{\"timeStamp\":\"2020-03-05T15:02:29.000000Z\",\"choices\":[0]},\"5e5d08d235bf95782b049cb3\":{\"timeStamp\":\"2020-03-05T15:02:34.000000Z\",\"choices\":[2]},\"5e5d0a05a0be6b6533195f17\":{\"timeStamp\":\"2020-03-05T15:02:43.000000Z\",\"choices\":[0]},\"5e5cecdcf3c27f611b3df2fa\":{\"timeStamp\":\"2020-03-05T15:03:01.000000Z\",\"choices\":[\"100\"]},\"5e5cedd7949da059190f2146\":{\"timeStamp\":\"2020-03-05T15:03:10.000000Z\",\"choices\":[1,3,4]},\"5e60e8e899017615e27ad107\":{\"timeStamp\":\"2020-03-05T15:03:15.000000Z\",\"choices\":[0]},\"5e60e95d479b812cb4777b2f\":{\"timeStamp\":\"2020-03-05T15:03:22.000000Z\",\"choices\":[0]},\"5e60e9feff05631d3b0585d8\":{\"timeStamp\":\"2020-03-05T15:03:59.000000Z\",\"choices\":[\"fveg\"]}},\"ip_address\":\"188.165.111.130\",\"created_at\":\"2020-03-05T14:02:08.621000Z\",\"updated_at\":\"2020-03-05T14:04:21.995000Z\"}"

мои определения объектов:

public class Respondant
{
    [JsonProperty("id")]
    public string Id { get; set; }

    [JsonProperty("ip_address")]
    public string IpAddress { get; set; }

    [JsonProperty("created_at")]
    public DateTimeOffset CreatedAt { get; set; }

    [JsonProperty("questions")]
    public Questions Questions { get; set; }

    [JsonProperty("complete")]
    public bool? Complete { get; set; }
}

public partial class Questions
{
    [JsonProperty("questionId")]
    public string QuestionId { get; set; }
}

public partial class QuestionId
{
    [JsonProperty("choices")]
    public string[] Choices { get; set; }
}

, а мой код десериализации следующий:

//JSon deserialization
JObject dragnsurveyRespondants = JObject.Parse(json);
// get JSON result objects into a list
searchResult = dragnsurveyRespondants.ToObject<Respondant>();
questions = dragnsurveyRespondants["questions"].Children().ToList();

Выполнение этого кода дает мне списки вопросов, но объект questionId, который должен состоять из вкладки / списка идентификаторов вопросов и ответов, имеет значение null.

Ant идея?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 07 августа 2020

Извините, но ваш запрос json и структура классов неверны. вот что я мог бы создать код

public class Respondant
{
    [JsonProperty("id")]
    public string Id { get; set; }

    [JsonProperty("ip_address")]
    public string IpAddress { get; set; }

    [JsonProperty("created_at")]
    public DateTimeOffset CreatedAt { get; set; }

    [JsonProperty("questions")]
    public Questions[] Questions { get; set; }

    [JsonProperty("complete")]
    public bool? Complete { get; set; }
}

public partial class Questions
{
    [JsonProperty("questionId")]
    public string QuestionId { get; set; }

    public Question Question { get; set; }
}

public partial class Question
{
    [JsonProperty("choices")]
    public string[] Choices { get; set; }
}

для создания json, сериализации и десериализации объекта

        var question = new Question();

        question.Choices = new string[] { "A", "B", "C" };

        var questions = new List<Questions>();
        questions.Add(new Questions() { QuestionId = "5e6106600066d227a231ceb8", Question = question });

     

        var request = new Respondant()
        {
            Id = "5e6106600066d227a231ceb8",
            Questions = questions.ToArray()
        };
        var jsonObj = Newtonsoft.Json.JsonConvert.SerializeObject(request);


        var response = Newtonsoft.Json.JsonConvert.DeserializeObject<Respondant> (jsonObj);
0 голосов
/ 07 августа 2020

Поле вопросов должно быть словарным. Поскольку ключ вопроса - это динамический c. Также поле выбора должно быть объектом, потому что выбор может быть целочисленным значением или строковым значением в файле json.

Таким образом, классы будут такими как:

public class Respondant
    {
        [JsonProperty("id")]
        public string Id { get; set; }

        [JsonProperty("ip_address")]
        public string IpAddress { get; set; }

        [JsonProperty("created_at")]
        public DateTimeOffset CreatedAt { get; set; }

        [JsonProperty("questions")]
        public Dictionary<string, Question> Questions { get; set; }

        [JsonProperty("complete")]
        public bool? Complete { get; set; }
    }

    public partial class Question
    {
        [JsonProperty("timeStamp")]
        public DateTime timeStamp { get; set; }

        [JsonProperty("choices")]
        public List<object> choices { get; set; }
    }

с использованием Newtonsoft.Json библиотека, вы можете десериализовать объект, например;

var respondant = JsonConvert.DeserializeObject<Respondant>(jsonString);

Для доступа к списку вопросов;

var questionList =respondant.Questions

Вы можете запросить по ключу в списке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...