Я отправляю большое количество разных графиков JSON с сервера на клиента (я контролирую оба), и все они содержат патологический случай: большой массив однородных (одинаковых) значений. Так, например, часть полезной нагрузки выглядит так:
[{"LongPropertyName":87, "AnotherVeryLongPropertyName":93,
"BlahBlahBlahBlahBlah": 78},
{"LongPropertyName":97, "AnotherVeryLongPropertyName":43,
"BlahBlahBlahBlahBlah": 578},
{"LongPropertyName":92, "AnotherVeryLongPropertyName":-3,
"BlahBlahBlahBlahBlah": 817}, ...
Я добавил некоторое форматирование, но, как вы можете видеть, это смешно с точки зрения Huffman encoding, т.е. что общие вещи должны быть эффективно выражены.
Итак, поскольку я контролирую как десериализацию, так и сериализацию, я хочу реализовать преобразование, где это:
[{"Key1":87,"Key2":99},{"Key1":42,"Key2":-8}]
превращается в нечто вроде этого:
[["$","Key1","Key2"],[87,99],[42,-8]]
который, как вы видите, более компактен даже с двумя объектами.
Где я могу подключиться к Json.NET для этого преобразования? Я хочу сделать это автоматически для максимально возможного количества объектов. Я нашел ContractResolvers, но я не уверен, что они происходят на том этапе, который я хочу - я не уверен, как использовать его методы для превращения JSON объект/словарь в массив.
В качестве альтернативы, если аналогичная вещь уже реализована для Json.NET, я бы хотел использовать ее вместо этого. Но я не смущен тем изменением, которое я хочу сделать (см. Выше), только там, где я бы зацепил Json.NET, чтобы это произошло.
(я пробовал gzipping его, он отлично работает и сбрасывает между 70% и 95%, но он все равно должен выводить полный текст JSON и делать все это сжатие/декомпрессию. Этот вопрос: как я могу просто выводить более компактная форма данных с самого начала?)
Обновление:. Как вы это делаете, с JsonConverter
. Я уже написал несколько, но по какой-то причине я думал, что они конфликтуют.
В итоге я основал базу Брайана Роджерса вместе с некоторыми изменениями, чтобы также вставлять/сглаживать любые объекты, которые содержат непосредственно. Это не было частью первоначального вопроса, но причина, по которой я это делал, состоит в том, что если бы у меня было:
[{"A": 42,"B":{"PropOne":87,"PropTwo":93,"PropThree":78}},
{"A":-72,"B":{"PropOne":97,"PropTwo":43,"PropThree":578}]
... Я закончил с:
[["A","B"],[42,{"PropOne":87,"PropTwo":93,"PropThree":78}],
[-72,{"PropOne":97,"PropTwo":43,"PropThree":578}]]
... и это ничего не спасает. Если я вставлял/сплющивал объект в качестве составляющих его ключей, я получаю:
[["A","B_PropOne","B_PropTwo","B_PropThree"],[42,87,93,78],[-72,97,43,578]]