Root decoder

By the same author: — visites virtuelles

It works with good ol’ JSONSerialization and the .allowFragmentsreading option. From the documentation:

Specifies that the parser should allow top-level objects that are not an instance of NSArray or NSDictionary.

let json = «22».data(using: .utf8)!

However, JSONDecoder has no such option and does not accept top-levelobjects which are not arrays or dictionaries. One can see in thesource code that the decode() method callsJSONSerialization.jsonObject() without any option:

Part of the Lecture Notes in Computer Science book series (LNTCS,volume 3985)


An implementation of reconfigurable architecture for MIMO V-BLAST (Vertical Bell Laboratories Layered Space-Time) detection based on the square root algorithm is proposed in this paper. This reconfigurable square root decoder supports MIMO system with various number of antennas, different throughputs and different signal constellations. The decoder architecture is based on various number of operators CORDIC (COordinate Rotation DIgital Computer). The system prototype of the decoder reaches 600Mbit/s data rate on an Xilinx Virtex-II FPGA for a 2 antennas system with a QPSK signal constellation.


Unable to display preview. Download preview PDF.


Wang, H., Leray, P., Palicot, J. (2006). A Reconfigurable Architecture for MIMO Square Root Decoder.

In: Bertels, K., Cardoso, J.M.P., Vassiliadis, S. (eds) Reconfigurable Computing: Architectures and Applications. ARC 2006. Lecture Notes in Computer Science, vol 3985. Springer, Berlin, Heidelberg.

Download citation

Services and devices log headers usually include static text meeting a pattern. It allows us to create a root decoder matching with all the logs sharing that particular pattern. The Regex (OS_Regex) syntax expressions are the tool we will use inside the decoders to easily locate the unchanging headers and their values.

Дополнительно:  Драйвер концентратора и хост-контроллера AMD USB 3.0 для 32- и 64-разрядной версии Windows 7 — ThinkPad Edge E145, X140e

It is good practice to first identify the log type in the prematch phase, and then use children decoder to extract the relevant data.

Decoder prematch

In the case of the Fortigate logs you can see the fields date, time and devname are always present at the beginning of every message, so they can be used in the root decoder prematch.

date=2019-10-10 time=17:01:31 devname=»FG111E-INFT2″

The decoder below extracts the values for the headers date, time and devname. The regex option finds the fields of interest and extracts them through the () operator. The order option defines what the parenthesis groups contain and the order in which they were received.

The devid, logid,type and subtype fields are extracted using S operator. It matches anything but whitespaces. To find fields containing whitespaces,  the . operator should be used.

When dealing with dynamically structured logs that provide information in various orders or sometimes omitting certain values, using modular logic decoders as the ones below could be game-changing. Check the “Sibling decoders: flexible extraction of information” blogpost for further information on this.

Example event

Using JSONDecoder alone, you cannot decode without some sort of outer struct, because your result is going to be an array of Article, which is an outer entity. Merely defining Article alone thus can never be sufficient.

If you dislike declaring an outer struct that you don’t need for any other purpose than to drill down to the «articles» key, that is easily solved by declaring it only temporarily within the limited scope where you do drill down to the «articles» key. The rest of your program is thus left with the Article struct but the outer struct doesn’t exist there.

Дополнительно:  Почему ноутбук не видит наушники: причины и решения

Other code can now see the Article struct and can call getArticles to parse the JSON and receive the array of Article, but other code never knows (and can never find out) that an extra Articles struct exist; it exists only temporarily within the getArticles function as a kind of local. It is no more objectionable than any other local variable created temporarily within a function body.

Rules design

In your custom init(from:) method you just need to decode each property using their respective keys.

let chosenCurrency = «gbp»

Swift 4 Codable; How to decode object with single root-level key

Здравствуйте! Эта страница может пригодиться, если вам прислали текст (предположительно на кириллице), который отображается в виде странной комбинации загадочных символов. Программа попытается угадать кодировку, а если не получится, покажет примеры всех комбинаций кодировок, чтобы вы могли выбрать подходящую.


Пожалуйста, обратите внимание на то, что данная бесплатная программа создана с надеждой, что она будет полезна, но без каких-либо явных или косвенных гарантий пригодности для любого практического использования. Вы можете пользоваться ей на свой страх и риск.

Если вы используете для перекодировки очень длинный текст, убедитесь, что имеется его резервная копия.


Русский (Russian) : chAlx ; Пётр Васильев (

Страница подготовки переводов на другие языки находится тут.

Что нового

October 2013 : I am trying different optimizations for the system which should make the decoder run faster and handle more text. If you notice any problem, please notify me ASAP.

На английской версии страницы доступен changelog программы.

Вернуться к кириллической виртуальной клавиатуре.

How to decode a nested JSON struct with Swift Decodable protocol?

Another approach is to create an intermediate model that closely matches the JSON (with the help of a tool like, let Swift generate the methods to decode it, and then pick off the pieces that you want in your final data model:

Дополнительно:  Root для jelly bean

This also allows you to easily iterate through reviews_count, should it contain more than 1 value in the future.

You might be able to do so with a custom init(decoder:), but another way is to hide the internal implementation where you stick to the JSON Model, and use lazy var or computed get. Lazy var will be load only once, it depends if you keep or not the root.

You can with an override of init(decoder:), but does it make the code clearer? I found it more difficult to write than the previous version (meaning, harder to debug/modify?)

How to correctly parse JSON with root element as an array in Swift 4?

This is really an awkwardly structured JSON. If you can’t get the sender to change the format, here’s my attempt at parsing it using JSONDecoder:

Swift Json how to decode with no top level key and autogenerated keys

Since you need to have the id it should be a property of Room

If you don’t want to make id optional you can decode it as a dictionary of dictionaries and create Room object when mapping

Testing the decoders and rules

Once the decoders and rules have been designed, it is necessary to ensure that they work properly. It should be verified using the ossec-logtest tool and also by ingesting the logs through the normal flow to see if they generate an alert.


For this test, we are creating a new dummy log: /var/log/test_file.log.

$ touch /var/log/test_file.log

Time to throw the sample event into /var/log/test_file.log. If our decoders and rules are working properly, the alert regarding the event should appear on the alerts.log file.

Оцените статью
Master Hi-technology
Добавить комментарий