Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从json c中提取密钥的值#_C#_Json_Assert - Fatal编程技术网

C# 从json c中提取密钥的值#

C# 从json c中提取密钥的值#,c#,json,assert,C#,Json,Assert,我有以下Json(是附加到项目的文件): 我需要提取例如Errors.NoCompletes.MSG的值,以便在断言中使用它与从API获得的输出进行比较。 到目前为止,我一直试图创建一个如下所示的词典: public class ErrorsDictionary { public string MSG; public string Description; } public class DicRoot { public Dictionary<string, ErrorsD

我有以下Json(是附加到项目的文件):

我需要提取例如Errors.NoCompletes.MSG的值,以便在断言中使用它与从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);
}
公共类错误字典
{
公共字符串MSG;
公共字符串描述;
}
公共级双子叶植物
{
公共字典错误{set;get;}
}
然后像这样使用它:

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);
}
diroot Json=JsonConvert.DeserializeObject(File.ReadAllText(@“c:\users\banu\source\repos\TestJsonLib\TestJsonLib\Json\ErrorMSG.Json”);
foreach(Json.Errors中的var f)
{
WriteLine(“Nume={0}Mesaj={1}Description={2}”、f.Key、f.Value.MSG、f.Value.Description);
}

问题是我不知道如何提取一个特定的值,就像我在上面为Errors.NoLOI.MSG所说的那样,以便能够在assert.Equals(ex,MyParam)这样的断言中使用它

我想你要的是这个

DicRoot dict = JsonConvert.DeserializeObject<DicRoot>(File.ReadAllText("foo.json"));
string msg = dict["NoLOI"].MSG;
dicolon dict=JsonConvert.DeserializeObject(File.ReadAllText(“foo.json”); 字符串msg=dict[“NoLOI”].msg;
我知道这看起来有点像是在工作。然而,它正在发挥作用

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; }
}
类程序
{
静态void Main(字符串[]参数)
{
字符串json=“{\'Errors\”:{\'NoCountry\”:{\'MSG\”:\“CountryCode字段是必需的。\”,“Description\”:\“请求中缺少国家参数时遇到的错误\”,“NoLOI\”:{\'MSG\:\“验证失败:\r\n--LengthOfInterview不能为空\”,“Description\:\”请求\“},}}”中缺少LOI参数时遇到错误;
var Json=JsonConvert.DeserializeObject(Json);
var obj=JsonConvert.DeserializeObject(Json.Errors.ToString());
foreach(obj中的var f)
{
WriteLine(“Nume={0}Mesaj={1}Description={2}”、f.Key、f.Value.MSG、f.Value.Description);
}
Console.Read();
}
}
公共类错误字典
{
公共字符串MSG{get;set;}
公共字符串说明{get;set;}
}
公共级双子叶植物
{
公共字典错误dic{set;get;}
}
类错误类
{
公共对象错误{get;set;}
}
输出:

Nume=NoCountry Mesaj=需要CountryCode字段。Description=请求中缺少国家/地区参数时遇到错误
Nume=NoLOI Mesaj=验证失败:

--LengthOfInterview不能为空Description=请求中缺少LOI参数时遇到错误

如果愿意,还可以使用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}");
}

您可以使用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
}

首先,我的印象是,scond MSG的值缺少一个双引号?我想在@OleEHDufour noticeedit之后也缺少逗号。我不清楚你在问什么。如果你有一本字典,并且知道要查找的键,只需使用
TryGetValue
或索引器即可。这正是我所需要的,只需提到它应该是:string msg=dict.Errors[“NoLOI”].msg;