将 JSON 字符串反序列化为 Dictionary<string,object>

Posted

技术标签:

【中文标题】将 JSON 字符串反序列化为 Dictionary<string,object>【英文标题】:Deserialize JSON string to Dictionary<string,object> 【发布时间】:2014-01-10 17:48:42 【问题描述】:

我有这个字符串:

[ "processLevel" : "1" , "segments" : [ "min" : "0", "max" : "600" ] ]

我正在反序列化对象:

object json = jsonSerializer.DeserializeObject(jsonString);

对象看起来像:

object[0] = Key: "processLevel", Value: "1"
object[1] = Key: "segments", Value: ...

并尝试创建字典:

Dictionary<string, object> dic = json as Dictionary<string, object>;

但是dic 得到null

可能是什么问题?

【问题讨论】:

如果 "json as IDictionary", var json = JsonConvert.DeserializeObject(jsonString, new ExpandoObjectConverter()); // 也许 ExpandoObject 就是你所想的动态对象。 【参考方案1】:

请参阅 mridula 的答案,了解您为什么会为空。但是如果你想直接将json字符串转换成字典,你可以试试下面的代码sn-p。

    Dictionary<string, object> values = 
JsonConvert.DeserializeObject<Dictionary<string, object>>(json);

【讨论】:

但我想反序列化为具有字典属性和其他普通属性的类。我该怎么做? 对于我的场景,我注意到该属性是只读的。所以反序列化过程无法设置该值。就我而言,我改为不只读,并且有效!但我认为您可以创建一个接收该属性的构造函数,如果您希望将其保持为只读【参考方案2】:

我喜欢这种方法:

using Newtonsoft.Json.Linq;
//jsonString is your JSON-formatted string
JObject jsonObj = JObject.Parse(jsonString);
Dictionary<string, string> dictObj = jsonObj.ToObject<Dictionary<string, object>>();

您现在可以使用dictObj 作为字典来访问任何您想要的内容。如果您希望将值作为字符串获取,也可以使用 Dictionary&lt;string, string&gt;

【讨论】:

感谢您加入 using 行,太多示例忽略了这一点。 @Blairg23 在上面的例子中它应该是`jsonObj.ToObject>();` 如何将dictObj 转回 json 格式的字符串?【参考方案3】:

as 关键字的MSDN documentation 声明语句expression as type 等效于语句expression is type ? (type)expression : (type)null。如果您运行 json.GetType(),它将返回 System.Object[] 而不是 System.Collections.Generic.Dictionary

在我想要反序列化 json 对象的对象类型很复杂的情况下,我使用 Json.NET 之类的 API。您可以将自己的反序列化器编写为:

class DictionaryConverter : JsonConverter

    public override bool CanConvert(Type objectType)
    
        Throw(new NotImplementedException());            
    

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    
        // Your code to deserialize the json into a dictionary object.

    

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    
        Throw(new NotImplementedException());   
    

然后您可以使用此序列化程序将 json 读入您的字典对象。这是example。

【讨论】:

这个关于相关问题的答案包含解决方案的完整源代码:***.com/a/31250524/356550【参考方案4】:

我遇到了同样的问题并找到了解决方案

很简单 没有错误 在运行产品上测试

步骤 1) 创建一个具有 2 个属性的泛型类

     public class CustomDictionary<T1,T2> where T1:class where T2:class
      
          public T1 Key  get; set; 
          public T2 Value  get; set; 
      

步骤 2) 创建新类并从第一个类继承

  public class SectionDictionary: CustomDictionary<FirstPageSectionModel, List<FirstPageContent>> 
     

    

步骤 3) 替换字典和列表

public Dictionary<FirstPageSectionModel, List<FirstPageContent>> Sections  get; set; 

 public List<SectionDictionary> Sections  get; set; 

第 4 步)轻松序列化或反序列化

 
     firstPageFinal.Sections.Add(new SectionDictionary  Key= section,Value= contents );
     var str = JsonConvert.SerializeObject(firstPageFinal);
     var obj = JsonConvert.DeserializeObject<FirstPageByPlatformFinalV2>(str);
 

非常感谢

【讨论】:

【参考方案5】:

问题是对象不是Dictionary&lt;string,object&gt; 类型或兼容类型,因此您不能直接转换。我会创建一个自定义对象并使用反序列化。

public class DeserializedObject
    public string processLevelget;set;
    public object segmentsget;set


IEnumerable<DeserializedObject> object=jsonSerializer.Deserialize<IEnumerable<DeserializedObject>>(json);

【讨论】:

以上是关于将 JSON 字符串反序列化为 Dictionary<string,object>的主要内容,如果未能解决你的问题,请参考以下文章

将json字符串反序列化为python中的对象

无法将 JSON 字符串反序列化为 C# 对象

System.Text.Json - 将嵌套对象反序列化为字符串

将Json字符串反序列化为对象java

如何使用 JSON-B 将 JSON 字符串反序列化为非公共类?

将嵌套的 JSON 字符串反序列化为 Java 对象