【问题标题】: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", ...}}"

标签: c# .net


【解决方案1】:

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

public class ResponseModel 
{
   public int PdfSearchCTTestExperiment{get;set;}
   [JsonProperty("_ecs")]
   public Dictionary<string,string> Ecs{get;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 是否适合您的需要?然后你可以通过反射转换回所需的类型

    【讨论】:

      猜你喜欢
      • 2018-12-04
      • 1970-01-01
      • 2020-08-15
      • 2012-11-09
      • 1970-01-01
      • 1970-01-01
      • 2016-04-23
      • 1970-01-01
      • 2021-10-16
      相关资源
      最近更新 更多