Подтвердить что ты не робот

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.

В чем может быть проблема?

4b9b3361

Ответ 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);