如何处理具有不同值类型的字典
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
【讨论】:
以上是关于如何处理具有不同值类型的字典的主要内容,如果未能解决你的问题,请参考以下文章