Member 14902374 Ответов: 1

Как я могу этого достичь


Я использую словарь для создания файла 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);


Я не уверен, что мой существующий словарный подход будет работать для узлов массива.

Я надеюсь, что это не кажется неуместным вопросом, но мне действительно нужна помощь с этим. Я ценю любые советы в правильном направлении. Заранее спасибо.

1 Ответов

Рейтинг:
2

BillWoodruff

Я думаю, что вы создаете кошмарный сценарий разбора с помощью этой стратегии.

Почему бы не использовать ваши строго типизированные классы с помощью WCF JSON DataContractJsonSerializer: [^]