Проблема при десериализации многомерного объекта json в c# с использованием JsonConvert.DeserializeObject - PullRequest
0 голосов
/ 17 января 2020

Я десериализирую объект json с помощью объекта JsonConvert.DeserializeObject:

"journalItemAccounts":"{\"item1\":\"2222\"}"

Мой код десериализации:

jsonResult.accountsData.journalItemAccounts != null ? JsonConvert.DeserializeObject<Dictionary<string, string>>(jsonResult.accountsData.journalItemAccounts) : null;

jsonResult.accountsData. journalItemAccounts содержит "journalItemAccounts": "{\" item1 \ ": \" 2222 \ "}"

Это отлично десериализуется. Но что, если мне нужно десериализовать объект следующим образом:

"journalItemAccounts":"{\"item1\":{\"incomeAccount\":\"5030\",\"expenseAccount\":\"\",\"assetAccount\":\"\"}}"

Ответы [ 3 ]

1 голос
/ 17 января 2020

Вы получаете это, потому что вы используете строку в качестве значения. Вместо этого вы используете тип объекта или класс.

jsonResult.accountsData.journalItemAccounts != null ? JsonConvert.DeserializeObject<Dictionary<string, Object>>(jsonResult.accountsData.journalItemAccounts) : null;
1 голос
/ 17 января 2020

Вы можете начать DeserializeObject с Dictionary<string, object> и проверить, является ли значение Object или Value. Вот пример метода для преобразования Json в значение или объект *

public class item1
{
    public string incomeAccount { get; set; }
    public string expenseAccount { get; set; }
    public string assetAccount { get; set; }
}

public static void ParseJson(string json)
{
    var keyValuePairs = JsonConvert.DeserializeObject<Dictionary<string, object>>(json);
    foreach (var keyvaluepair in keyValuePairs)
    {
        var obj = keyvaluepair.Value.ToString();
        decimal itemvalue;
        if (decimal.TryParse(obj, out itemvalue))
        {
            Console.WriteLine(itemvalue);
        }
        else
        {
            var result = JsonConvert.DeserializeObject<item1>(obj);
            Console.WriteLine($"{ result.incomeAccount } - {result.expenseAccount} - {result.assetAccount}");
        }
    }            
}

Вызовите этот метод, чтобы получить желаемый результат

ParseJson("{\"item1\":\"2222\"}");

ParseJson("{\"item1\":{\"incomeAccount\":\"5030\",\"expenseAccount\":\"5031\",\"assetAccount\":\"0532\"}}");

Выход

2222

5030 - 5031 - 0532
1 голос
/ 17 января 2020

Создайте тип и передайте его так.

var deserializedObject = JsonConvert.DeserializeObject<Model>(jsonResult.accountsData.journalItemAccounts);

public class Model
{
    public AnotherModel item1 { get; set; }
}

public class AnotherModel
{
    public string incomeAccount { get; set; }
    public string expenseAccount { get; set; }
    public string assetAccount { get; set; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...