【问题标题】:Get Key / Value of JSON object with Newtonsoft使用 Newtonsoft 获取 JSON 对象的键/值
【发布时间】:2019-02-16 16:41:46
【问题描述】:

我看到很多关于我正在尝试做的事情的问题和答案,但在阅读了答案后,我无法从这个 json 中获得关键和价值。

这是返回的 json:

      {
"@odata.context": "https://con813-crm612cf723bbf35af6devaos.cloudax.dynamics.com/data/$metadata#Customers(CustomerAccount,Name)",
"value": [
    {
        "@odata.etag": "W/\"JzAsMjI1NjU0MjE1NTg7MCwwOzAsNTYzNzE0NTMyODswLDU2MzcxNDQ1NzY7MCwyMjU2NTQyNTY5MzswLDIyNTY1NDI3MjM2OzAsMDswLDIyNTY1NDI3MjM2OzAsMjI1NjU0MjcyMzY7MCwwJw==\"",
        "CustomerAccount": "DE-001",
        "Name": "Contoso Europe"
    },
    {
        "@odata.etag": "W/\"JzAsMjI1NjU0MjE1NTk7MCwwOzAsMzU2MzcxNDkxMTI7MCw1NjM3MTQ0NTc3OzAsMjI1NjU0MjU2OTQ7MCwyMjU2NTQyNzIzODswLDA7MCwyMjU2NTQyNzIzODswLDIyNTY1NDI3MjM4OzAsMCc=\"",
        "CustomerAccount": "US-001",
        "Name": "Contoso Retail San Diego"
    },
    {
        "@odata.etag": "W/\"JzAsMjI1NjU0MjE1NjA7MCwwOzAsMzU2MzcxNDkxMTM7MCw1NjM3MTQ0NTc4OzAsMjI1NjU0MjU2OTU7MCwyMjU2NTQyNzI0MDswLDA7MCwyMjU2NTQyNzI0MDswLDIyNTY1NDI3MjQwOzAsMCc=\"",
        "CustomerAccount": "US-002",
        "Name": "Contoso Retail Los Angeles"
    }
]

}

我需要获取键的名称,在本例中为“CustomerAccount”和“Name”,然后是它们的值。我想不出只返回这些值。

        JObject parsedJson = JObject.Parse(_json);

        StringBuilder builder = new StringBuilder();

        foreach (JProperty property in parsedJson.Properties())
        {
            builder.Append((string.Format("Name: [{0}], Value: [{1}].", property.Name, property.Value)));
        }

希望增加更多的清晰度;在此示例中,我想在“@odata.etag”之后写出键/值,其中键是“CustomerAccount”和“Name”,它们的值在冒号之后。键/值是动态的,所以我需要循环写出每个“@odata.etag”值之后的键名和值。

【问题讨论】:

  • "我不知道只返回这些值" 你到底想返回什么以及如何返回?您只想返回 StringBuilder 中构建的字符串吗?构建字符串本身是问题吗?还是问题不在于构建字符串本身,而在于如何返回构建的字符串?

标签: c# json


【解决方案1】:

使用JsonConvert.DeserializeObject 并传递您要解析的对象类型。最后缺少一个右花括号。我希望我能正确理解你想要做什么,如果不是请发表评论

    class Value
    {
        public string CustomerAccount { get; set; }
        public string Name { get; set; }

    }

    class Customer
    {
        public List<Value> Value { get; set; }

    }
    class Program
    {
        static void Main(string[] args)
        {

          var obj =  JsonConvert.DeserializeObject<Customer>(@"     {
            '@odata.context': 'https://con813-crm612cf723bbf35af6devaos.cloudax.dynamics.com/data/$metadata#Customers(CustomerAccount,Name)',
            'value': [
            {
                '@odata.etag': 'W/\'JzAsMjI1NjU0MjE1NTg7MCwwOzAsNTYzNzE0NTMyODswLDU2MzcxNDQ1NzY7MCwyMjU2NTQyNTY5MzswLDIyNTY1NDI3MjM2OzAsMDswLDIyNTY1NDI3MjM2OzAsMjI1NjU0MjcyMzY7MCwwJw==\'',
                'CustomerAccount': 'DE-001',
                'Name': 'Contoso Europe'
            },
            {
                '@odata.etag': 'W/\'JzAsMjI1NjU0MjE1NTk7MCwwOzAsMzU2MzcxNDkxMTI7MCw1NjM3MTQ0NTc3OzAsMjI1NjU0MjU2OTQ7MCwyMjU2NTQyNzIzODswLDA7MCwyMjU2NTQyNzIzODswLDIyNTY1NDI3MjM4OzAsMCc=\'',
                'CustomerAccount': 'US-001',
                'Name': 'Contoso Retail San Diego'
            },
            {
                '@odata.etag': 'W/\'JzAsMjI1NjU0MjE1NjA7MCwwOzAsMzU2MzcxNDkxMTM7MCw1NjM3MTQ0NTc4OzAsMjI1NjU0MjU2OTU7MCwyMjU2NTQyNzI0MDswLDA7MCwyMjU2NTQyNzI0MDswLDIyNTY1NDI3MjQwOzAsMCc=\'',
                'CustomerAccount': 'US-002',
                'Name': 'Contoso Retail Los Angeles'
            }
            ]
            }");

            foreach (var value in obj.Value)
            {
                Console.WriteLine($"Name: 'Name' Value: {value.Name}");
                Console.WriteLine($"Name: 'CustomerAccount' Value: {value.CustomerAccount}");
            }

        }
    }

如果您不知道对象的键(属性是动态的),您可以使用以下代码 sn-p 但它需要更改类声明。

class Customer
{
    //this is list of value objects (value is a dictionary) 
    public List<Dictionary<String,String>> Value { get; set; }

}

下面是如何反序列化和循环遍历值数组

   var obj =  JsonConvert.DeserializeObject<Customer>(myString);

   foreach (var value in obj.Value)
   {
         foreach (var key in value)
         {
             if (key.Key == "@odata.etag")
                 continue;
             Console.WriteLine("Name: [{0}], Value: [{1}]",key.Key, key.Value);
         }
   }

【讨论】:

  • 感谢您的回复。我永远不会知道键名,所以我需要写出它的键/值对。在此示例中,它是 CustomerAccount 和 Name,但它可以是任何东西。我需要写出“@odata.etag”之后的任何内容,可能是无限的行和无限的键/值。
  • @Darin,您需要清楚地指定 Json 中什么构成键、什么构成值以及(除非在 JSOn 中非常明显,但目前不是)关联的值有多精确用钥匙。您需要在此处解释您的问题以回应答案是一个相当大的信号,告诉您您的问题缺乏清晰度和/或完全理解您的问题/问题所需的信息。
  • @Darin chk 我更新答案的最后一部分,请不要忘记评价我的答案)谢谢
猜你喜欢
  • 1970-01-01
  • 2014-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多