将嵌套的JSON反序列化为Dictionary,string和class

时间:2017-09-21 04:31:28

标签: c# json class dictionary nested

我有一个JSON,我想将DeserializeObject变成带有innerDictionary和innermostClass的outerDictionary,如下所示:

var entityMap = JsonConvert.DeserializeObject<Dictionary<string, Dictionary<string, fieldClass>>>(File.ReadAllText("map.json"));

但是,innerDictionary可能有一个字符串:string 而不是 string:innerMostClass。

{
"Client": {
    "__class__": "contact",

    "ClientId": {
        "__field__": "new_ndisclientid",
        "__type__": "string"
    },
    "GivenName": {
        "__field__": "firstname",
        "__type__": "string"
    },
},
"Case": {
    "__class__": "contact",

    "CaseId": {
        "__field__": "new_ndiscaseid",
        "__type__": "string"
    }
}
}

有办法做到这一点吗?我不想把所有这些都变成课程。

是否可以使用自定义JsonConverter执行此操作?

编辑:为了清楚起见,将类名重命名为entityName。 ClientId和GivenName将被反序列化为fieldClasses。

2 个答案:

答案 0 :(得分:2)

您可以使用动态或对象而不是内部类

    var json =
        "{\r\n\t\"Client\": {\r\n\t\t\"__entityName__\": \"contact\",\r\n\r\n\t\t\"ClientId\": {\r\n\t\t\t\"__field__\": \"new_ndisclientid\",\r\n\t\t\t\"__type__\": \"string\"\r\n\t\t},\r\n\t\t\"GivenName\": {\r\n\t\t\t\"__field__\": \"firstname\",\r\n\t\t\t\"__type__\": \"string\"\r\n\t\t}\r\n\t}\r\n}";
    var deserialized = JsonConvert.DeserializeObject<Dictionary<string, Dictionary<string, dynamic>>>(json);
List<object> values = deserialized.SelectMany(result => result.Value).Cast<object>().ToList();

如果你想要单独的内部类

public class Client
{
    public string __entityName__ { get; set; }
    public Dictionary<string, string> ClientId { get; set; }
    public Dictionary<string, string> GivenName { get; set; }
}
var deserializedWithClass = JsonConvert.DeserializeObject<Dictionary<string, Client>>(json);

答案 1 :(得分:0)

将嵌套的 JSON 反序列化为 Class。不是基于字典,但很有用。

步骤 01:打开链接 https://jsonformatter.org/json-parser

步骤 02:复制下来的内容。

{
"Client": {
    "__class__": "contact",

    "ClientId": {
        "__field__": "new_ndisclientid",
        "__type__": "string"
    },
    "GivenName": {
        "__field__": "firstname",
        "__type__": "string"
    }
},
"Case": {
    "__class__": "contact",

    "CaseId": {
        "__field__": "new_ndiscaseid",
        "__type__": "string"
    }
}
}

步骤 03:打开上面的链接。复制内容并粘贴到左侧,然后单击到 JSON Parser 按钮。如下图所示。enter image description here

步骤 04:点击下载按钮。下载 jsonformatter.txt 文件。成功下载文件为 jsonformatter.txt。

第 05 步:复制第 02 步的内容并打开 url https://json2csharp.com/。复制内容并粘贴到左侧,然后单击“转换”按钮。如下图所示。enter image description here

步骤 06:在脚本中。

(A) 创建 myRootClass.cs 文件并将内容复制并粘贴到您的文件中。[[System.Serializable] 它用于统一 3d 软件 c# 脚本]

[System.Serializable]
public class myRootClass
{
    [System.Serializable]
    public class ClientId
    {
        public string __field__ { get; set; }
        public string __type__ { get; set; }
    }
    [System.Serializable]
    public class GivenName
    {
        public string __field__ { get; set; }
        public string __type__ { get; set; }
    }
    [System.Serializable]
    public class Client
    {
        public string __class__ { get; set; }
        public ClientId ClientId { get; set; }
        public GivenName GivenName { get; set; }
    }
    [System.Serializable]
    public class CaseId
    {
        public string __field__ { get; set; }
        public string __type__ { get; set; }
    }
    [System.Serializable]
    public class Case
    {
        public string __class__ { get; set; }
        public CaseId CaseId { get; set; }
    }
    [System.Serializable]
    public class Root
    {
        public Client Client { get; set; }
        public Case Case { get; set; }
    }
}

    

(B) 读取 jsonformatter.txt 文件。

// Read entire text file content in one string 
    string  textFilePath = "C:/Users/XXX/Downloads/jsonformatter.txt";//change path
    string jsontext = System.IO.File.ReadAllText(textFilePath);  
    Debug.Log("Read Json"+jsontext);// used Console.Writeline

(C) 将字符串转换为 C# 并显示数据。

  Root myDeserializedClass = JsonConvert.DeserializeObject<Root>(jsontext); 
  var client = myDeserializedClass.Client;
  Debug.Log("client.__class__ :- "+client.__class__); //used Console.Writeline
  Debug.Log("client.ClientId.__field__ :- "+client.ClientId.__field__);// used Console.Writeline
  Debug.Log("client.GivenName.__field__ :- "+client.GivenName.__field__);// used Console.Writeline