Deserialize строка JSON для словаря <строка, объект>
У меня есть эта строка:
[{ "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
.
В чем может быть проблема?
Ответы
Ответ 1
Обратите внимание на ответ mridula за то, почему вы получаете нуль. Но если вы хотите напрямую преобразовать строку json в словарь, вы можете попробовать следующий фрагмент кода.
Dictionary<string, object> values =
JsonConvert.DeserializeObject<Dictionary<string, object>>(json);
Ответ 2
документация MSDN для ключевого слова as
означает, что оператор expression as type
эквивалентен выражению expression is type ? (type)expression : (type)null
. Если вы запустите json.GetType()
, он вернет System.Object[]
, а не System.Collections.Generic.Dictionary
.
В таких случаях, когда тип объекта, в который я хочу десериализовать json-объект, является сложным, я использую API, подобный Json.NET. Вы можете написать собственный десериализатор как:
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 в свой словарь. Здесь пример.
Ответ 3
Мне нравится этот метод:
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>
, если вы предпочитаете получать значения в виде строк.
Ответ 4
Проблема заключается в том, что объект не имеет тип Dictionary<string,object>
или совместимый тип, поэтому вы не можете напрямую его использовать. Я бы создал пользовательский объект и использовал Deserialize.
public class DeserializedObject{
public string processLevel{get;set;}
public object segments{get;set}
}
IEnumerable<DeserializedObject> object=jsonSerializer.Deserialize<IEnumerable<DeserializedObject>>(json);