skip to Main Content

I have been asked to supply data in a json in the following format:

{
    "testsystem": "1.0.0",
    "playback": { 
       "1": {
          "cue": 1,
          "state": "Stopped",
          "label": "Hello"
       },
       "2": {
          "cue": 100,
          "state": "Running",
          "label": "Hello"
       }
    }
}

I have been using Newtonsoft json to serialise the information but there a couple of points which confuse me.

public class Company
        {
            [JsonProperty("testsystem")]
            public string testsystem { get; set; }

            [JsonProperty("playback")]
            public pb playback { get; set; }

        }

        public class pb
        {
            [JsonProperty("playback")]
            public int playback { get; set; }

            //[JsonProperty("cue")]
            public cue cue { get; set; }
        }


        public class cue
        {
            [JsonProperty("cue")]
            public string number { get; set; }

            [JsonProperty("state")]
            public string state { get; set; }

            [JsonProperty("label")]
            public string label { get; set; }

        }

My class declarations

Company thisCompany = new Company
{
    testsystem = "1.0.0",
    for (PB = 1; PB < 7; PB++)
    {
       playback = new pb
       {
           cue = new cue
           {
           number = Globals.QNumber[1],                             
           state = Globals.QState[1],
           label = Globals.QLabel[1]                             
           }
       }
}
string json = JsonConvert.SerializeObject(thisCompany);

The section of code im trying to serialise

So my first issue is that I cant figure out how to have the "playback" sections nested so that there are 2 as in the example. I tried adding a for loop but (shown in my code above) but that seems to take the playback = new pb line out of context?

The 2nd issue is that i wind up with a double "playback section shown in the output below (i took the for loop out to get this bit to work)

{
  "testsystem": "1.0.0",
  "playback": {
    "playback": 0,
    "cue": {
      "cue": "34",
      "state": "Running",
      "label": "Hello World"
    }
  }
}

I feel like this must be simple but im just missing the simplest thing and overthinking. Thanks in advance for any thoughts and suggestions.

2

Answers


  1. I don’t think your model is quite fits the example json. It should look more like this with your "playback" object being a dictionary:

    public class Company
    {
        [JsonProperty("testsystem")]
        public string Testsystem { get; set; }
    
        [JsonProperty("playback")]
        public Dictionary<string, Playback> Playback { get; set; }
    }
    
    public class Playback
    {
        [JsonProperty("cue")]
        public int Cue { get; set; }
    
        [JsonProperty("state")]
        public string State { get; set; }
    
        [JsonProperty("label")]
        public string Label { get; set; }
    }
    

    Then you can create the object and serialize them like so:

    public static string CreateCompanyJson()
    {
        var thisCompany = new Company
        {
            Testsystem = "1.0.0",
            Playback = new Dictionary<string, Playback>()
        };
        for (var pb = 1; pb < 7; pb++)
        {
            thisCompany.Playback[$"{pb}"] = new Playback
            {
                Cue = pb,
                State = $"State-{pb}",
                Label = $"Label-{pb}"
            };
        }
         return JsonConvert.SerializeObject(thisCompany, Formatting.Indented);
    }
    

    Which will generate the json that’s formatted like your sample:

    {
      "testsystem": "1.0.0",
      "playback": {
        "1": {
          "cue": 1,
          "state": "State-1",
          "label": "Label-1"
        },
        "2": {
          "cue": 2,
          "state": "State-2",
          "label": "Label-2"
        },
        "3": {
          "cue": 3,
          "state": "State-3",
          "label": "Label-3"
        },
        "4": {
          "cue": 4,
          "state": "State-4",
          "label": "Label-4"
        },
        "5": {
          "cue": 5,
          "state": "State-5",
          "label": "Label-5"
        },
        "6": {
          "cue": 6,
          "state": "State-6",
          "label": "Label-6"
        }
      }
    }
    
    Login or Signup to reply.
  2. if you need only a json string , you don’t need any classes

        var company = new JObject
        {
            ["testsystem"] = "1.0.0",
            ["playback"] = new JObject()
        };
        for (var pb = 1; pb < 7; pb++)
        {
            ((JObject)company["playback"]).Add(
            CreateJsonProperty(pb.ToString(), pb * 10, $"state{pb}", $"label{pb}")
            );
        }
    
        var json = company.ToString();
    
    public static JProperty CreateJsonProperty(string pb, int cue, string state, string label)
    {
        return new JProperty(pb, new JObject
        {
            ["cue"] = cue,
            ["state"] = state,
            ["label"] = label
        });
    }
    
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search