将 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请参阅 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<string, string>
。
【讨论】:
感谢您加入using
行,太多示例忽略了这一点。
@Blairg23 在上面的例子中它应该是`jsonObj.ToObjectdictObj
转回 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<string,object>
类型或兼容类型,因此您不能直接转换。我会创建一个自定义对象并使用反序列化。
public class DeserializedObject
public string processLevelget;set;
public object segmentsget;set
IEnumerable<DeserializedObject> object=jsonSerializer.Deserialize<IEnumerable<DeserializedObject>>(json);
【讨论】:
以上是关于将 JSON 字符串反序列化为 Dictionary<string,object>的主要内容,如果未能解决你的问题,请参考以下文章
System.Text.Json - 将嵌套对象反序列化为字符串