Как инициировать объект класса из словаря с помощью Lambda / LINQ, проанализированного Newtonsoft.Json? - PullRequest
0 голосов
/ 18 марта 2019

со вчерашнего дня я пытался реализовать ffmpeg через Xabe-Wrapper в моем C # -Проекте. Я использовал FFMpeg => FFProbe, чтобы получить данные формата и потока в виде json-строки из некоторых фильмов. Это JSON, который я получил для потоков.

"{
  "streams": [
    {"codec_name": "mpeg4", "codec_type": "video"},
    {"codec_name": "mp3"  , "codec_type": "audio"}
  ]
}"

Следуйте, что Newtonsoft Wiki , я десериализовал его как DataSet. Я начал играть и нашел способ сделать это в «oneliner».

Streams = (JsonConvert.DeserializeObject<DataSet>(StreamProbeJSON, JSerializerSettings)).Tables["streams"].AsEnumerable().Select(value => new FormatAVInfo.SInfo(value.Field<string>("codec_type"), value.Field<string> ("codec_name")));

Для формата я получаю этот Json

{
    "format": {
        "format_name": "avi",
        "probe_score": 100
    }
}

Следуйте за тем, что Newtonsoft Wiki , я десериализовал этот словарь как словарь, но я не умел снова делать это в oneliner. Это не большая проблема, но я хотел бы узнать, как мне этого добиться?

Я пробовал это

Format = (JsonConvert.DeserializeObject<Dictionary<string, 
    Dictionary<string, string>>>(FormatProbeJSON, JSerializerSettings)) 
    ["format"].Select(value => new FormatAVInfo.FInfo(value["format_name"], 
    value["probe_score"]));

Но, конечно, я получаю KeyValuePair и не могу использовать индексатор для этого. Я также пытался с JObject, с тем же результатом. Конечно, я мог бы просто сделать еще одно поле

Dictionary<string,string> Temp = 
    (JsonConvert.DeserializeObject<Dictionary<string, 
    Dictionary<string, string>>>(FormatProbeJSON, JSerializerSettings)) 
    ["format"]

И потом приводить в пример, но мне любопытно, есть ли способ сделать это.

Спасибо

1 Ответ

0 голосов
/ 18 марта 2019

Вы должны десериализовать этот тип данных в модель, а не в Dictionary, поскольку она имеет фиксированную структуру, а не динамическую.

Например, давайте назовем модель «MyMovieData».

public class MyMovieData
{
    [JsonProperty("streams"]
    public MovieStream[] Streams { get; set; }
}

public class MovieStream[]
{
    [JsonProperty("codec_name")]
    public string CodecName { get; set; }

    [JsonProperty("codec_type")]
    public string CodecType { get; set; }
}

Теперь вы можете десериализовать его очень простым способом:

MyMovieData bigBuckBunnyData = JsonConvert.DeserializeObject<MyMovieData>(json);

MovieStream[] bigBuckBunnyStreams = bigBuckBunnyData.Streams;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...