2016-10-07 1 views
3

Я успешно десериализую возвращаемый массив JSON из запроса RESTful GET в мою старую объектную модель C#.C# Deserializing JSON с помощью json.net, хотите извлечь индекс массива как свойство модели

Я использую аннотации [JSONProperty foo], чтобы привязать имена JSON к моим свойствам модели.

JSON вернулся, выглядит следующим образом:

[{ 
    "ProductCode": "0129923083091", 
    "Description": "DIESEL ", 
    "SalesLitres": 6058.7347, 
    "SalesValue": 6416.2000 
}, 
{ 
    "ProductCode": "0134039344902", 
    "Description": "UNLEADED ", 
    "SalesLitres": 3489.8111, 
    "SalesValue": 3695.7100 
}, 
... 
] 

Я хотел бы создать что-то похожее на уникальное поле индекса в моей модели, которая синтезируется на основе порядка появления массива элементов возвращаемых из JSON ,

Для справки, мои текущие аннотации (без свойства индексации) выглядит так:

namespace App8.Models 
{ 
    public class ReportRow 
    { 
     [JsonProperty("ProductCode")] 
     public string ProductCode { get; set; } = string.Empty; 

     [JsonProperty("Description")] 
     public string Description { get; set; } = string.Empty; 

     [JsonProperty("SalesLitres")] 
     public double SalesLitres { get; set; } = 0.0; 

     [JsonProperty("SalesValue")] 
     public double SalesValue { get; set; } = 0.0;  
    } 
} 

Есть аннотация для этого предусмотрена Newtonsoft Json.NET ... Или есть какой-то код, который Я могу поместить в геттер/сеттеры для производства первичного ключа, по существу?

ответ

1

Предполагая

public class ReportRow { 
    public int Index { get; set; } 

    [JsonProperty("ProductCode")] 
    public string ProductCode { get; set; } = string.Empty; 

    [JsonProperty("Description")] 
    public string Description { get; set; } = string.Empty; 

    [JsonProperty("SalesLitres")] 
    public double SalesLitres { get; set; } = 0.0; 

    [JsonProperty("SalesValue")] 
    public double SalesValue { get; set; } = 0.0;  
} 

После десериализации данных

var data = JsonConvert.DeserializeObject<List<ReportRow>>(json); 

Вы можете использовать LINQ выбрать, чтобы получить индексы.

var indexedData = data.Select((item, index) => { 
    item.Index = index; 
    return item; 
}).ToList(); 

Или, если индекс не является свойством модели, создайте тип «на лету» с одним.

var indexedData = data.Select((item, index) => new { 
    Index = index, 
    ReportRow = item 
}).ToList(); 
+0

Это выглядит очень хорошо. Я обязательно попробую. – retail3r

+0

Использование linq для создания побочных эффектов немного подозрительно. Если вы никогда не перечисляете запрос, побочный эффект никогда не запускается! –

 Смежные вопросы

  • Нет связанных вопросов^_^