Извлечь значение для ключа из JSON C # - PullRequest
0 голосов
/ 01 июля 2018

У меня есть следующий Json (это файл, прикрепленный к проекту):

{
  "Errors": {
    "NoCountry": {
      "MSG": "The CountryCode field is required.",
      "Description": "Error encountered when Country parameter is missing from the request"
    },
    "NoLOI": {
      "MSG": "Validation failed: \r\n -- LengthOfInterview cannot be empty"
      "Description": "Error encountered when LOI parameter is missing from the request"
    }
  }
}

Мне нужно извлечь значения, например, для Errors.NoCompletes.MSG, чтобы использовать его в assert для сравнения с выводом, который я получаю из API. До сих пор я пытался создать словарь, который выглядит следующим образом:

public class ErrorsDictionary
{
  public string MSG;
  public string Description;
}

public class DicRoot
{
    public Dictionary<string, ErrorsDictionary> Errors { set; get; }
}

И используйте это так:

DicRoot Json = JsonConvert.DeserializeObject<DicRoot>(File.ReadAllText(@"c:\users\banu_\source\repos\TestJsonLib\TestJsonLib\Json\ErrorMSG.json"));
foreach (var f in Json.Errors)
{
    Console.WriteLine("Nume={0} Mesaj={1} Description={2}",f.Key, f.Value.MSG, f.Value.Description);
}

Проблема в том, что я не могу понять, как я могу извлечь конкретное значение, например, то, что я сказал выше для Errors.NoLOI.MSG, чтобы иметь возможность использовать его в assert, как Assert.Equals (например, MyParam); * +1010 *

Ответы [ 4 ]

0 голосов
/ 01 июля 2018

Вы можете использовать Newtonsoft.json NuGet. Попробуйте это

var files = JObject.Parse(YourJson);
var recList = files.SelectTokens("$..Errors").ToList();
foreach (JProperty prop in recList.Children())
{
    string key = prop.Name.ToString();
    string value = prop.Value.ToString();
    //Do your stuffs here
}
0 голосов
/ 01 июля 2018

Я знаю, что это выглядит как обходной путь. Тем не менее, это работает.

class Program
{
    static void Main(string[] args)
    {
        string json = "{\"Errors\": {\"NoCountry\": {\"MSG\": \"The CountryCode field is required.\",\"Description\": \"Error encountered when Country parameter is missing from the request\"},\"NoLOI\": {\"MSG\": \"Validation failed: \r\n -- LengthOfInterview cannot be empty\", \"Description\": \"Error encountered when LOI parameter is missing from the request\"},}}";

        var Json = JsonConvert.DeserializeObject<ErrorsClass>(json);
        var obj = JsonConvert.DeserializeObject<Dictionary<string, ErrorsDictionary>>(Json.Errors.ToString());

        foreach (var f in obj)
        {
            Console.WriteLine("Nume={0} Mesaj={1} Description={2}", f.Key, f.Value.MSG, f.Value.Description);
        }
        Console.Read();
    }
}

public class ErrorsDictionary
{
    public string MSG { get; set; }
    public string Description { get; set; }
}

public class DicRoot
{
    public Dictionary<string, ErrorsDictionary> ErrorsDic { set; get; }
}

class ErrorsClass
{
    public object Errors { get; set; }
}

Выход:

Nume=NoCountry Mesaj=The CountryCode field is required. Description=Error encountered when Country parameter is missing from the request Nume=NoLOI Mesaj=Validation failed: -- LengthOfInterview cannot be empty Description=Error encountered when LOI parameter is missing from the request

0 голосов
/ 01 июля 2018

Вы также можете использовать JsonPath, анонимные типы и интерполяцию строк, если хотите:

JObject obj = JObject.Parse(json);

var errors = obj
    .SelectTokens("$.Errors.*")
    .ToDictionary(
        e => ((JProperty)e.Parent).Name,
        e => new { Msg = e["MSG"], Descr = e["Description"] });

foreach (var e in errors)
{
    Console.WriteLine($"Nume={e.Key} Mesaj={e.Value.Msg} Description={e.Value.Descr}");
}
0 голосов
/ 01 июля 2018

Я думаю, что вы спрашиваете, это?

DicRoot dict = JsonConvert.DeserializeObject<DicRoot>(File.ReadAllText("foo.json"));
string msg = dict["NoLOI"].MSG;
...