Skip to content

Issue when dumping a vector of derived classes #4462

@myermo

Description

@myermo

Description

I need to serialize a vector composed by derived classes. I have a Container class which holds two variables, one of them being a std::vector<Base>. When dumping the contents of the vector, only the members of the Base class are detected, and the members of the Derived classes are omitted.

Reproduction steps

Just execute the example provided.

https://godbolt.org/z/KbxKs688Y

Expected vs. actual results

Actual Result
{ "Container": { "a": 2, "data": [ { "b": 3 }, { "b": 5 } ] } }

Expected Result
{ "Container": { "a": 2, "data": [ { "b": 3, "d": 4 }, { "b": 5, "d": 6 } ] } }

Minimal code example

#include <iostream>
#include "nlohmann/json.hpp"

using json = nlohmann::ordered_json;

// Minimum example of the bug
struct Base
{
  int b{};

  Base(int b) : b(b) {};
};

struct Derived : public Base
{
  int d{};

  Derived(int b, int d) : Base(b), d(d) {};
};

struct Container
{
  int a{};
  std::vector<std::shared_ptr<Base>> v{};

  Container(int a, std::vector<std::shared_ptr<Base>> v) : a(a), v(v) {};
};

void to_json(json& j, const std::shared_ptr<Base>& b)
{
  j = json{{"b", b->b}};
}

void to_json(json& j, const std::shared_ptr<Derived>& d)
{
  j = json{{"b", d->b}};
  j.update("d", d->d);
}

void to_json(json& j, const std::shared_ptr<Container>& c)
{
  j = json{ { "a", c->a } , { "data", c->v } };
}

void createOutputJson()
{
  json j;

  auto d1 = std::make_shared<Derived>(3, 4);
  auto d2 = std::make_shared<Derived>(5, 6);

  std::vector<std::shared_ptr<Base>> v2 = {d1, d2};

  auto C = std::make_shared<Container>(2, v2);

  j["Container"] = C;

  std::cout << j.dump(4) << std::endl;
}

int main() {
    createOutputJson();
}


### Error messages

```Shell
N/A

Compiler and operating system

Arch Linux, GCC 14.2.1 and CLANG 19.1.0

Library version

b36f4c4

Validation

Metadata

Metadata

Assignees

No one assigned

    Labels

    solution: invalidthe issue is not related to the library

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions