从json字符串中提取信息,并将其添加到C#中的列表中

时间:2018-07-24 00:59:35

标签: c# .net json

我是json的新手。我需要不同用户的信息,并将它们添加到c#(.net开发)中的 dataGridView dataTable dataSet 中。信息示例为(json有效):

{
    "JrPwbApfIHbQhCUmVIoiVJcPYv93": {
        "address": "Jessore",
        "name": "Dev"
    },
    "iBRZAyn8TQTOgKTcByGOvJjL9ZB3": {
        "address": "Bogra",
        "name": "Kumar Saikat"
    }
}

我想要他们这样:


User1 |杰索尔|开发人员


User2 |博格拉|库玛·赛卡特(Kumar Saikat)

即使我列出所有清单也将有所帮助。

我相信我可以通过
反序列化它们(完全不确定) var model = JsonConvert.DeserializeObject<user>(json);

其中用户是类。

 public class Item
{

    public string name;
    public string address;

}

来自this question-answer。如果属性已知,我可以从this tutorial获取值。但是在我的情况下,我的属性是未知的((字符串“ User1”,“ User2”是随机的,因为我将从数据库中获取它们)。在此问题上的任何帮助和帮助将不胜感激。先感谢您。

3 个答案:

答案 0 :(得分:6)

您正在查看JSON字典,因此只需将其反序列化即可:

public static Dictionary<string,Item> ParseJson(string source)
{
    return JsonConvert.DeserializeObject<Dictionary<string,Item>>(source);
}

如果您这样称呼它:

public static void Main()
{
    var input = @"{'JrPwbApfIHbQhCUmVIoiVJcPYv93': {'address': 'Jessore','name': 'Dev' }, 'iBRZAyn8TQTOgKTcByGOvJjL9ZB3': {'address': 'Bogra','name': 'Kumar Saikat'}}";

    var result = ParseJson(input);

    foreach (var r in result)
    {
        Console.WriteLine("Key={0};Name={1};Address={2}", r.Key, r.Value.name, r.Value.address);
    }
}

输出为:

Key=JrPwbApfIHbQhCUmVIoiVJcPYv93;Name=Dev;Address=Jessore
Key=iBRZAyn8TQTOgKTcByGOvJjL9ZB3;Name=Kumar Saikat;Address=Bogra

此示例将列表转储到控制台,但是您可以轻松地修改for循环以添加到列表中。

DotNetFiddle上查看我的示例

答案 1 :(得分:0)

可以使用nuget包Newtonsoft.Json。这段代码为您提供了您想要的东西:

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

namespace ConsoleApp1
{
    internal class Program
    {
        static void Main(string[] args)
        {
            var json =
                "{\"JrPwbApfIHbQhCUmVIoiVJcPYv93\":{\"address\":\"Jessore\",\"name\":\"Dev\"}," +
                "\"iBRZAyn8TQTOgKTcByGOvJjL9ZB3\":{\"address\":\"Bogra\",\"name\":\"Kumar Saikat\"}}";


            var o = JsonConvert.DeserializeObject(json);

            var items = new List<Item>();

            foreach (dynamic x in o as IEnumerable)
            {
                var i = new Item();
                var y = x.First;
                i.Name = y.name.Value;
                i.Address = y.address.Value;
                items.Add(i);
            }
        }

        public class Item
        {
            public string Name { get; set; }
            public string Address { get; set; }
        }
    }
}

您的情况有点奇怪,因为这些自动创建的名称例如 “ JrPwbApfIHbQhCUmVIoiVJcPYv93”,否则比较容易,但是应该是相当容易的代码。

请记住,我在此处使用“动态”功能,这意味着在运行时出现问题,而不是在设计时遇到问题,因为未对其进行检查。

答案 2 :(得分:0)

反序列化的正确方法如下所示

var model = JsonConvert.DeserializeObject<Dictionary<string, Item>>(data);

在您发布的代码示例中,您的“ 用户”类名称为“ 项目”,但是您尝试使用“ 用户”进行反序列化在您的代码中。另外请注意,您不能直接将数据反序列化为用户列表,因为它以某些随机字符串的值形式出现。

var model = JsonConvert.DeserializeObject<user>(json);

为使您的代码正确反序列化,您的json格式应如下:

{
{
    "address": "Jessore",
    "name": "Dev"
},
{
    "address": "Bogra",
    "name": "Kumar Saikat"
}

}