Как сериализовать словарь с атрибутом JsonConvert +, чтобы скрыть имя словаря? - PullRequest
0 голосов
/ 10 января 2020

Я пытаюсь сериализовать эту модель

public class Rootobject
{
    public Los los { get; set; }
    public int Id { get; set; }
}



      public class Los
        { 
[JsonConverter(typeof(DictionaryToJsonObjectConverter))]
            public Dictionary<DateTime, List<Item>> items { get; set; }
        }


public class Item
{
    public string currency { get; set; }
    public int guests { get; set; }
    public int[] price { get; set; }
}

, и я получаю это

{
    "los": {
        "items": {
            "2020-01-10T00:00:00+01:00": [
                {
                    "currency": "EUR",
                    "guests": 1,
                    "price": [
                        443
                    ]
                }
            ],
            "2020-01-11T00:00:00+01:00": [
                {
                    "currency": "EUR",
                    "guests": 1,
                    "price": [
                        500
                    ]
                }
            ]
        }
    },
    "Id": 1
}

, и я хотел бы получить этот ответ

{
    "los": {
            "2020-01-10T00:00:00+01:00": [
                {
                    "currency": "EUR",
                    "guests": 1,
                    "price": [
                        443
                    ]
                }
            ],
            "2020-01-11T00:00:00+01:00": [
                {
                    "currency": "EUR",
                    "guests": 1,
                    "price": [
                        500
                    ]
                }
            ]
    },
    "Id": 1}

Я хотел бы использовать атрибуты для достижения этой цели, но я не уверен, как.

Я пытался написать свой собственный конвертер json, но это не очень помогло

 public class DictionaryToJsonObjectConverter : JsonConverter
    {
        public override bool CanConvert(Type objectType)
        {
            return typeof(IDictionary<DateTime, List<Item>>).IsAssignableFrom(objectType);
        }

        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            throw new NotImplementedException();
        }

        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            writer.WriteRawValue(JsonConvert.SerializeObject(value, Formatting.Indented));
        }
    }

1 Ответ

1 голос
/ 10 января 2020

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

RootObject
|
|
|--los (with json proerty set to display)
    |
    |
    |--- items dictionary

Что вам нужно, это:

RootObject
|
|
|-- items dictionary los (either rename the property name to los or use JsonProperty to use los)

Итак, чтобы получить требуемый результат, пожалуйста, вставьте класс Los и переместите строку ниже непосредственно под RootObject:

public Dictionary<DateTime, List<Item>> items { get; set; }

и переименуйте элементы в los.

Итак, после изменений, Итак, ваш объект Rootobject выглядит следующим образом:

public class Rootobject
{
    // public Los los { get; set; }
    // I don't think you need this converter unless you have special logic   
    [JsonConverter(typeof(DictionaryToJsonObjectConverter))]
    public Dictionary<DateTime, List<Item>> los { get; set; }
    public int Id { get; set; }
}
...