【问题标题】:Trouble while deserializing multidimentional json object in c# using JsonConvert.DeserializeObject使用 JsonConvert.DeserializeObject 在 c# 中反序列化多维 json 对象时出现问题
【发布时间】:2020-01-17 09:58:03
【问题描述】:

我正在使用 JsonConvert.DeserializeObject 反序列化一个 json 对象 对象是这样的:

"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\":\"\"}}"

【问题讨论】:

    标签: c# json json.net deserialization


    【解决方案1】:

    您可以以Dictionary&lt;string, object&gt; 开头DeserializeObject 并检查值是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
    

    【讨论】:

    • 感谢克里希纳的回答非常有用。您能否在同一答案上再添加一个解决方案,如果“journalItemAccounts”未修复,则它可能是“{\”item1\”:\“2222\”}”,也可能是“{\”item1\”:{ \"incomeAccount\":\"5030\",\"expenseAccount\":\"5031\",\"assetAccount\":\"0532\"}}" 那么我们将如何检索它的值
    【解决方案2】:

    创建一个类型并像这样传递它。

    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; }
    }
    

    【讨论】:

    • 谢谢你的解决方案,我已经尝试了所有给定的解决方案,都很有帮助。 @krishna Muppalla 给出了更简短的说明,包括您的解决方案
    【解决方案3】:

    你得到这个是因为你使用字符串作为值。您可以改用 Object 类型或类。

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

    【讨论】:

    • 感谢您的解决方案。正是我需要用对象定义字典来获取对象类型的值
    猜你喜欢
    • 2023-02-09
    • 1970-01-01
    • 2017-06-15
    • 1970-01-01
    • 2020-12-04
    • 1970-01-01
    • 2013-02-10
    • 2013-10-10
    • 2012-06-22
    相关资源
    最近更新 更多