Можно ли заставить json.net пропустить сериализацию некоторых значений по умолчанию в словаре - PullRequest
0 голосов
/ 30 января 2019

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

Вот упрощенный код этого словаря

public Dictionary<int, Item> allItems;

public class Item
{
    public bool IsSelected;
    public List<string> SelectionInfo;
}

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

"allItems": {
    "0": {
      "IsSelected": true,
      "SelectionInfo": [
        "yes",
        "maybe",
        "no"
      ]
    },
    "1": {
      "IsSelected": false,
      "SelectionInfo": []
    }
  }

Я хочу пропустить«1» Но не просто пропустите его, по крайней мере, сохраните ключ, чтобы его можно было восстановить позже.и иметь 0 и 1 в словаре

Как это?

"allItems": {
    "0": {
      "IsSelected": true,
      "SelectionInfo": [
        "yes",
        "maybe",
        "no"
      ]
    },
    "1": { }
  }

Я осмотрелся и обнаружил, что вы можете использовать JsonConverter.Но мой инструмент case JSON находится в другом Project (Utility.Please.TurnToJson(item);), и я хочу, чтобы он был согласованным и использовал только один JSON во всех проектах.Возможно, если JsonConverter является единственным вариантом, по крайней мере, предоставьте мне решение о том, как передать пользовательский JsonConverter в этот проект.

///somewhat like this?
Utility.Please.TurnToJson(item, new List<object>(){
    typeof(Custom1),
    typeof(Custom2)
});

1 Ответ

0 голосов
/ 30 января 2019

Вот JsonConverter, который может дать вам ожидаемый результат.

Преобразователь может сохранить ваш ключ в любом случае, если массив IsSelected = false и SelectionInfo пуст.

public class MyCustomJsonConverter : JsonConverter
{
    public override bool CanRead
    {
        get { return false; }
    }

    public override bool CanConvert(Type objectType)
    {
        return true;
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        throw new NotImplementedException("Unnecessary because CanRead is false. The type will skip the converter.");
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        JObject jObj = new JObject();
        if (value != null)
        {
            var dict = JObject.Parse(value as string)["allItems"].ToObject<Dictionary<string, Item>>();
            foreach (var item in dict)
            {
                JObject jObject = new JObject();

                if (item.Value.IsSelected == false && item.Value.SelectionInfo.Count == 0)
                {
                    jObj.Add(new JProperty(item.Key, new JObject()));
                }
                else
                {
                    jObj.Add(new JProperty(item.Key, JObject.FromObject(item.Value)));
                }
            }
        }

        JObject jMainObject = new JObject();
        jMainObject.Add(new JProperty("allItems", jObj));
        jMainObject.WriteTo(writer);
    }
}

Использование:

string json = File.ReadAllText(@"Path to your json file");

string output = JsonConvert.SerializeObject(json, new MyCustomJsonConverter());

Выход:

enter image description here

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