Как я могу этого достичь
Я использую словарь для создания файла Json. Данные в словаре будут выглядеть примерно так:
Dictionary<string, string> inputValues = new Dictionary<string, string>(); inputValues.Add("Employee.Person.PersonalInfo.HRCode", "HR1234"); inputValues.Add("Employee.Person.PersonalInfo.FirstName", "ABC"); inputValues.Add("Employee.Person.PersonalInfo.LastName", "XYZ"); inputValues.Add("Employee.Person.Salary[0].Amount", "76850.00"); inputValues.Add("Employee.Person.Salary[0].Currency", "USD"); inputValues.Add("Employee.Person.Salary[1].Amount", "87954.00"); inputValues.Add("Employee.Person.Salary[1].Currency", "INR"); inputValues.Add("Employee.Address.[0].Home.[0].Address1", "Address0Home0 Address1"); inputValues.Add("Employee.Address.[0].Home.[0].Address2", "Address0.Home0 Address2"); inputValues.Add("Employee.Address.[1].Home.[0].Address1", "Address1.Home0 Address1"); inputValues.Add("Employee.Address.[1].Home.[0].Address2", "Address1.Home0 Address2");
Значения в словаре будут заполняться динамически, поэтому мы не можем предсказать эти значения. Это может быть любое имя ключа и любая глубина, обозначенная точкой что-то вроде: "key1.key2.keyN". Теперь я хочу сериализовать каждый ключ и значение, которые я получаю из словаря, в Json. Если ключ представляет собой индексное значение типа: [0], [1] и т.д., то все остальные ключи после этого должны быть созданы в виде массива под его родительским элементом. Ожидаемый результат с тестовыми данными сверху будет выглядеть следующим образом:
{ "Employee": { "Person": { "PersonalInfo": { "HRCode": "HR1234", "FirstName": "ABC", "LastName": "XYZ" }, "Salary": [ { "Amount": "76850.00", "Currency": "USD" }, { "Amount": "87954.00", "Currency": "INR" } ], "Address": [ { "Home": [ { "Address1": "Address0Home0 Address1", "Address2": "Address0.Home0 Address2" } ] }, { "Home": [ { "Address1": "Address1.Home0 Address1", "Address2": "Address1.Home0 Address2" } ] } ] } } }
Что я уже пробовал:
Я использую JSON.NET но я едва поцарапал поверхность и не знаю, есть ли способ для этого. Я попробовал что-то, как показано ниже, чтобы добавить элементы в отдельные словари, созданные в иерархической структуре. Он работает, как и ожидалось, для узлов, которые не имеют никакого индекса.
Dictionary<string, string> inputValues = new Dictionary<string, string>(); inputValues.Add("Employee.Person.PersonalInfo.HRCode", "HR1234"); inputValues.Add("Employee.Person.PersonalInfo.FirstName", "Sumith"); inputValues.Add("Employee.Person.PersonalInfo.LastName", "Joy"); inputValues.Add("Employee.Person.Salary.[0].Amount", "76850.00"); inputValues.Add("Employee.Person.Salary.[0].Currency", "USD"); inputValues.Add("Employee.Person.Salary.[1].Amount", "87954.00"); inputValues.Add("Employee.Person.Salary.[1].Currency", "INR"); inputValues.Add("Employee.Address.[0].Home.[0].Address1", "Home1.Address1"); inputValues.Add("Employee.Address.[0].Home.[0].Address2", "Home1.Address2"); inputValues.Add("Employee.Address.[0].Home.[1].Address1", "Home2.Address1"); inputValues.Add("Employee.Address.[0].Home.[1].Address2", "Home2.Address2"); inputValues.Add("Employee.Address.[0].Home.[1].Home1.[0].Address1", "Home2.Address1"); inputValues.Add("Employee.Address.[0].Home.[1].Home1.[1].Address2", "Home2.Address2"); inputValues.Add("Employee.Person.BankDetails.Primary.AccountNo", "AC5544"); var res = new Dictionary<string, Object>(); foreach (var pair in inputValues) { var key = pair.Key; var parts = key.Split('.'); var currentObj = res; for (int i = 0; i < parts.Length - 1; i++) { var property = parts[i]; if (!currentObj.Keys.Contains(property)) currentObj[property] = new Dictionary<string, Object>(); currentObj = currentObj[property] as Dictionary<string, Object>; } currentObj[parts[parts.Length - 1]] = pair.Value; } var json = JsonConvert.SerializeObject(res, Formatting.Indented);
Я не уверен, что мой существующий словарный подход будет работать для узлов массива.
Я надеюсь, что это не кажется неуместным вопросом, но мне действительно нужна помощь с этим. Я ценю любые советы в правильном направлении. Заранее спасибо.