如何处理具有不同值类型的字典

Posted

技术标签:

【中文标题】如何处理具有不同值类型的字典【英文标题】:How to handle dictionary with different value type 【发布时间】:2022-01-19 10:25:14 【问题描述】:

我有一个案例,网络调用将检索 json 字符串。就像

""PdfSearchCTTestExperiment": 0, "_ecs": "PdfSearchCTTestExperiment": "P-X-100967-1-13""

基本上,响应会有两种值类型,一种是字符串,另一种是字典

而且我需要将内部和外部键值对反序列化到字典中。这是我的做法:

var outerDict = JsonConvert.DeserializeObject<Dictionary<string, dynamic>>(ss);

string innerDictString = JsonConvert.SerializeObject(outerDict["_ecs"]);

var innerDict = JsonConvert.DeserializeObject<Dictionary<string, string>>(innerDictString );

它有效,但我认为这不是有效的方法。 Baiscally,由于类型系统,我需要再做两次解析。有更好的方法来实现这一点吗?谢谢!

【问题讨论】:

澄清一下,json 响应可能有多个键值对。示例:“”PdfSearchCTTestExperiment”:0,“key1”:“value1”,“key2”:“value2”,...,“_ecs”:“PdfSearchCTTestExperiment”:“PX-100967-1-13”,“ key1" : "PS-2121-21-1", ..." 【参考方案1】:

您可以为您的回复创建一个模型,例如:

public class ResponseModel 

   public int PdfSearchCTTestExperimentget;set;
   [JsonProperty("_ecs")]
   public Dictionary<string,string> Ecsget;set;

然后像这样反序列化它:

var responseModel = JsonConvert.DeserializeObject<ResponseModel>(ss);
Console.WriteLine(responseModel.Ecs["PdfSearchCTTestExperiment"]);

【讨论】:

我不确定字典是否真的需要,或者它是否应该只是另一个包含其成员的响应类。我相信 OP 只是将everyting 视为“字典”,而不是尝试指定与 JSON 匹配的类。 感谢您的回答,响应可能有多个键值对并且不仅限于“PdfSearchCTTestExperiment”,有没有办法动态允许更多的键值对?【参考方案2】:

json


    "PdfSearchCTTestExperiment": 0,
    "key1": "value1",
    "key2": "value2",
    "_ecs": 
        "PdfSearchCTTestExperiment": "P-X-100967-1-13"
    

达到你真正需要的最简单的方法是 json 解析,而不是反序列化

var jsonObject = JObject.Parse(json);

测试

string key1= (string) jsonObject["key1"];
string pdfSearchCTTestExperiment= (string)jsonObject["_ecs"]["PdfSearchCTTestExperiment"];

如果您仍想反序列化为 2 个字典而不是解析,则必须创建一个类

public class Dictionaries

    public Dictionary<string, string> OuterDict  get; set; 

    public Dictionary<string, string> InnerDict  get; set; 

代码

var jsonObject = JObject.Parse(json);

var dictionaries = new Dictionaries
OuterDict = jsonObject.Properties().Where(o => o.Name != "_ecs").ToDictionary(o => o.Name, o => (string)o.Value),
InnerDict = jsonObject.Properties().Where(o => o.Name == "_ecs").FirstOrDefault().Value.ToObject<Dictionary<string, string>>()
;

测试

string key1=dictionaries.OuterDict["key1"];
string pdfSearchCTTestExperiment= dictionaries.InnerDict["PdfSearchCTTestExperiment"];

【讨论】:

【参考方案3】:

Dictionary 是否适合您的需要?然后你可以通过反射转换回所需的类型

【讨论】:

以上是关于如何处理具有不同值类型的字典的主要内容,如果未能解决你的问题,请参考以下文章

Actionscript:如何处理具有相同类型但具有不同函数侦听器的事件?

如何处理 DBUtil 中的日期类型值

人们如何处理迭代 Swift 结构值类型属性?

服务器返回<null>值 iOS 端如何处理

写入期望类型不是浮点数的数据库时如何处理 NaN 值?

如何处理具有 35 个唯一值的分类数据?