Десериализация пары ключ-значение в список - PullRequest
0 голосов
/ 21 мая 2018

Может кто-нибудь показать мне, как десериализовать пару ключ-значение в список?т.е. из ответа JSON я хочу получить список стран и код из ответа ниже.Я использую Newtonsoft.Json:

{
    "status": "SUCCESS",
    "message": "something",
    "data": {
        "trade_origin_iso3country": "GBR",
        "countries": {
            "ARM ": "Armenia",
            "BLR": "Belarus ",
            "DNK": "Denmark",
            "GBR": "United Kingdom",
            "MCO": "Monaco"
        }
    }
}

Ответы [ 4 ]

0 голосов
/ 21 мая 2018

Я рекомендую пользовательские типы, если это возможно.Вот консольное приложение, которое вы можете скопировать и вставить, которое показывает, что я имею в виду, используя предоставленную вами информацию. Используется хорошо известный и настоятельно рекомендуемый пакет Newtonsoft.Json nuget.

Код:

using Newtonsoft.Json;
using System;
using System.Collections.Generic;

namespace Question_Answer_Console_App
{
    public class Program
    {
        public const string JsonResultString = @"{
                                                     ""status"": ""SUCCESS"",
                                                     ""message"": ""something"",
                                                     ""data"": {
                                                         ""trade_origin_iso3country"": ""GBR"",
                                                         ""countries"": {
                                                             ""ARM"": ""Armenia"",
                                                             ""BLR"": ""Belarus "",
                                                             ""DNK"": ""Denmark"",
                                                             ""GBR"": ""United Kingdom"",
                                                             ""MCO"": ""Monaco""
                                                         }
                                                     }
                                                 }";
        [STAThread]
        static void Main(string[] args)
        {
            var jsonResult = JsonConvert.DeserializeObject<JsonResult>(JsonResultString);

            foreach (var keyValue in jsonResult.Data.Countries)
                Console.WriteLine($"{keyValue.Key} : {keyValue.Value}");

            Console.Read();
        }
    }

    public class JsonResult
    {
        public string Status { get; set; }
        public string Message { get; set; }
        public JsonData Data { get; set; }
    }

    public class JsonData
    {
        [JsonProperty("trade_origin_iso3country")]
        public string TradeOriginIso3country { get; set; }
        public Dictionary<string, string> Countries { get; set; }
    }
}

Выходы:

ARM : Armenia
BLR : Belarus
DNK : Denmark
GBR : United Kingdom
MCO : Monaco
0 голосов
/ 21 мая 2018

Вы можете использовать JObject.Parse для анализа json в JObject, а затем получить доступ к внутреннему свойству и преобразовать его в Dictionary<string, string>:

var countries = JObject.Parse(json)["data"]["countries"].ToObject<Dictionary<string, string>>();
foreach (var kv in countries)
{
    Console.WriteLine($"Key[{kv.Key}] Value[{kv.Value}]");
}

Будет выводить:

Key[ARM] Value[Armenia]
... etc.
0 голосов
/ 21 мая 2018

Если вы создаете класс со следующим определением:

public class MyObject 
{
     public string status { get; set; }
     public string message { get; set; }
     public MySubObject data { get; set; }
}

public class MySubObject 
{
    public string trade_origin_iso3country { get; set;}
    public Dictionary<string,string> countries { get;set;}
}

Вы можете просто использовать наиболее удобный (по крайней мере IMO) синтаксис, чтобы получить объект с заполненным словарем.

var myResult = JsonConvert.Deserialize<MyObject>(json);

Чтобы получить список:

var result = (
     from kvp in myResult.data.countries
     select $"{kvp.Key}: {kvp.Value}").ToList()
0 голосов
/ 21 мая 2018
var data = JsonConvert.DeserializeObject<Dictionary<string, string>>(json);

foreach(var kv in data)
{
Console.WriteLine(kv.Key + ":" + kv.Value);
}

попробуйте

...