Десериализовать строковые значения в ienumerable <t>in asp. net core 3 - PullRequest
0 голосов
/ 29 апреля 2020

Я хочу десериализовать эти json данные в Result class и поместить 3 значения книги (FirstBook, SecondBook, ThirdBook) в IEnumerable :

[
  {      
    "Id": 1,
    "FirstBook": "B1",
    "SecondBook": "B2",
    "ThirdBook": "B3",
    ...    
  },
  {
    "Id": 2,
    "FirstBook": "BB1",
    "SecondBook": "BB2",
    "ThirdBook": "BB3",
    ...
  }
]

Класс результата:

public class Result
{
  public int Id { get; set;}

  [JsonConverter(typeof(BooksJsonConverter))]
  public IEnumerable<Book> Books { get; set; }
}

Класс книги:

public class Book
{
    public string Name { get; set; }
}

Десериализовать его в класс Результат , содержащий IEnumerable <Книга>

JsonConvert.DeserializeObject<IEnumerable<Result>>(json);

Я думаю, что я должен создать JsonConverter:

public class BooksJsonConverter : JsonConverter<IEnumerable<Book>>
{
    public override IEnumerable<Book> ReadJson(JsonReader reader, Type objectType, IEnumerable<Book> existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        //What should i write here?
        return new List<Book>();
    }

    public override void WriteJson(JsonWriter writer, Book value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

В этой ситуации Read Json из BooksJsonConverter не вызывается, но когда я добавляю JsonProperty, приписываю, что он вызывается, но я не знаете, что мне писать внутри Читать Json:

public class Result
{
  public int Id { get; set;}

  [JsonConverter(typeof(BooksJsonConverter))]
  [JsonProperty("FirstBook")]
  public IEnumerable<Book> Books { get; set; }
}

Вопрос в том, как мне преобразовать FirstBook, SecondBook, ThirdBook из json в IEnumerable внутри класса результатов?

1 Ответ

0 голосов
/ 30 апреля 2020

Поскольку вы не предоставили структуру класса Book, я настроил ее, чтобы включить поле BookName следующим образом.

   public class Book
    {
        public string BookName { get; set; }
    }



[JsonConverter(typeof(CustomeJsonConverter))]
public class Result
{
    public int Id { get; set; }
    public IEnumerable<Book> Books { get; set; }
}

Обновление

Хорошо, jsonconverter может достичь этого, метод примерно такой же, но вам нужно добавить собственный атрибут jsonconverter в класс Result вместо Book, где класс Book будет преобразован и добавлен к результату.

Вот код:

 public class HomeController : Controller
    {
        public IActionResult Test()
        {
            string json = @" [
    {
      'Id': 1,
      'FirstBook': 'B1',
      'SecondBook': 'B2',
      'ThirdBook': 'B3'
    },
    {
      'Id': 2,
      'FirstBook': 'BB1',
      'SecondBook': 'BB2',
      'ThirdBook': 'BB3'
    }
  ] ";
            var xx = JsonConvert.DeserializeObject<IEnumerable<Result>>(json,new CustomeJsonConverter());
            return Ok();
        }

    }


public class CustomeJsonConverter : JsonConverter
    {
        public override bool CanConvert(Type objectType)
        {
            return System.Attribute.GetCustomAttributes(objectType).Any(v => v is KnownTypeAttribute);
        }
        public override bool CanWrite
        {
            get { return false; }
        }

        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        { 
            // Load JObject from stream
            JObject jObject = JObject.Load(reader);
            Result result = new Result();
            Dictionary<string, string> dictObj = jObject.ToObject<Dictionary<string, string>>();
            List<Book> books = new List<Book>();
            foreach (var obj in dictObj)
            {
                if (obj.Key.Contains("Book"))
                {
                    Book book = new Book()
                    {
                        Name = obj.Value
                    };
                    books.Add(book);
                }
            }
            result.Id = Convert.ToInt32(dictObj["Id"]);
            result.Books = books.AsEnumerable();
            return result; 
        }


        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            throw new NotImplementedException();
        }

    }

Вы также можете сослаться на this .

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