GHauan
GHauan

Reputation: 189

How to deserialize json inside a json to a string property

I am reading a json-string from an API (in a script component i SSIS). The json looks something like the one below (this is only one record, the real string contains many more). When trying to deserialize into a class containing the needed properties, I would like to put the "value" for the "costCenters"-property into a string property in my table. How ever, since the costCenters-value in itself contains a JSON, the deserialization fails (because it encounters the objects inside it).

If I exclude the property CostCenters from my class, it manages to deserialize the other properties just fine. I would think (hope) that it would be possible to force the inner JSON into a string property? Any suggestions?

This is my class that is used for the deserilazing:

internal class Unit
{
    public int ParentId { get; set; }
    public int CompanyId { get; set; }
    public string Abbreviation { get; set; }
    public string AbbreviationPath { get; set; }
    public int Manager { get; set; }
    public int UnitId { get; set; }
    public string Name { get; set; }
    public string LevelDescription { get; set; }
    public int OrfuCompanyId { get; set; }
    public string Resh { get; set; }

    //If the below propery is commented out, the deserializing works fine.
    public string CostCenters { get; set; }
    public int Level { get; set; }
    public int OrfuUnitId { get; set; }
}

This is how I call the deserializer for NewtonSoft:

var units = new List<Unit>();
units = JsonConvert.DeserializeObject<List<Unit>>(jsonString);

This is how the jsonString looks (edited):

[
  {
    "$id": "1",
    "parentId": 999,
    "companyId": 9123,
    "abbreviation": "ZZZ",
    "abbreviationPath": "SOMEPATH",
    "costCenters": [
      {
        "$id": "12",
        "costCenter": "12345",
        "costCenterSourceId": "99",
        "costCenterSource": "TBF",
        "costCenterTypeId": "999",
        "costCenterType": "TypeOfCostCenter",
        "startDate": "2018-01-01T00:00:00",
        "endDate": "9999-12-31T00:00:00"
      },
      {
        "$id": "88",
        "costCenter": "191945444",
        "costCenterSourceId": "88",
        "costCenterSource": "TBB",
        "costCenterTypeId": "15",
        "costCenterType": "SomeTextHere",
        "startDate": null,
        "endDate": null
      }
    ],
    "manager": 12345678,
    "deputy": 0,
    "homeShare": "\\\\someaddress.net\\someFolder\\SomeCode",
    "objectGuid": "ThisIsAGUID",
    "distinguishedName": "OU=ABC,OU=NNN,OU=FFF,OU=HHH,OU=HNV,OU=IDK,DC=heipaadeg,DC=com",
    "orfuUnitId": 9125,
    "orfuCompanyId": 9123,
    "resh": "123456789",
    "nis": "",
    "unitId": 4321,
    "name": "2 some name",
    "level": 9,
    "levelDescription": "Level number 4"
  }
]

Upvotes: 3

Views: 2206

Answers (1)

Hussain Khalil
Hussain Khalil

Reputation: 1650

One workaround is to add a field to Unit called CostCentersString in which the CostCenters list is re-serialized:

In Unit class definition:

...

public List<dynamic> CostCenters { get; set; }

public String CostCentersString { get; set; }

Then use:

List<Unit> units = JsonConvert.DeserializeObject<List<Unit>>(jsonString);

foreach (Unit u in units)
{
    u.CostCentersString = JsonConvert.SerializeObject(u.CostCenters);
}

Upvotes: 2

Related Questions