Json десериализует игнорирование объектов с неправильными значениями - PullRequest
0 голосов
/ 20 марта 2019

Я хочу, чтобы мой десериализатор json игнорировал объекты с неправильными значениями (например, строка вместо int) или возвращал для них значение null и продолжал десериализовать оставшуюся часть файла json.

Вот мой json:

{
    "requests":[
        {
            "clientId":"1",
            "requestId":"1",
            "name":"Bułka",
            "quantity":"1",
            "price":"10.00"
        },
        {
            "clientId":"1",
            "requestId":"2.1",
            "name":"Chleb",
            "quantity":"2",
            "price":"15.00"
        },
        {
            "clientId":"1",
            "requestId":"2",
            "name":"Chleb",
            "quantity":"5",
            "price":"15.00"
        },
        {
            "clientId":"2",
            "requestId":"1",
            "name":"Chleb",
            "quantity":"1",
            "price":"10.00"
        }
    ]
}

Вот классы, к которым я десериализуюсь:

class RequestCollection
{
    public List<Request> requests { get; set; }

    public RequestCollection()
    {
        requests = new List<Request>();
    }
}

class Request
{
    public string clientId { get; set; }
    public long requestId { get; set; }
    public string name { get; set; }
    public int quantity { get; set; }
    public double price { get; set; }

    public Request() { }
    public Request(string clientID, long requestID, string name, int quantity, double price)
    {
        this.clientId = clientID;
        this.requestId = requestID;
        this.name = name;
        this.quantity = quantity;
        this.price = price;
    }
}

А вот как я десериализирую файл:

requestCollectionLocal = JsonConvert.DeserializeObject<RequestCollection>(json);

Как вы можетевидите, у меня неправильное значение requestId во 2-м объекте в файле json.Я хочу, чтобы результатом десериализации были только 3 других объекта или все 4 объекта с нулевыми значениями вместо неправильных.

1 Ответ

0 голосов
/ 20 марта 2019

Вы можете десериализовать свой json в анонимный тип, а затем отфильтровать результат с помощью linq

Определить анонимный тип, например

var template = new {
  requests = new [] {
    new {
      clientId = "",
      requestId = "",
      name = "",
      quantity = "",
      price = ""
    } 
  }
};

Здесь вы можете видеть, что все типы являются строковыми, поэтому десериализациядолжно хорошо работать.Теперь вы должны проверить, что можно преобразовать каждую строку в соответствующий тип данных с помощью TryParse.Полный код:

var json = "{\r\n    \"requests\":[\r\n        {\r\n            \"clientId\":\"1\",\r\n            \"requestId\":\"1\",\r\n            \"name\":\"Bułka\",\r\n            \"quantity\":\"1\",\r\n            \"price\":\"10.00\"\r\n        },\r\n        {\r\n            \"clientId\":\"1\",\r\n            \"requestId\":\"2.1\",\r\n            \"name\":\"Chleb\",\r\n            \"quantity\":\"2\",\r\n            \"price\":\"15.00\"\r\n        },\r\n        {\r\n            \"clientId\":\"1\",\r\n            \"requestId\":\"2\",\r\n            \"name\":\"Chleb\",\r\n            \"quantity\":\"5\",\r\n            \"price\":\"15.00\"\r\n        },\r\n        {\r\n            \"clientId\":\"2\",\r\n            \"requestId\":\"1\",\r\n            \"name\":\"Chleb\",\r\n            \"quantity\":\"1\",\r\n            \"price\":\"10.00\"\r\n        }\r\n    ]\r\n}";

var template = new { requests = new [] { new {clientId = "", requestId = "", name = "", quantity = "", price = ""} }};
var tempRequestCollection = JsonConvert.DeserializeAnonymousType(json, template);

var result = new RequestCollection
{
    requests = tempRequestCollection.requests
        .Where(r => 
            long.TryParse(r.requestId, out var _)
            && int.TryParse(r.quantity, out var _)
            && double.TryParse(r.price, out var _)
          )
        .Select(r => new Request
        {
            clientId = r.clientId,
            requestId = long.Parse(r.requestId),
            name = r.name,
            quantity = int.Parse(r.quantity),
            price = double.Parse(r.price)
        })
        .ToList()
};
...