【问题标题】:Extracting Information from json string and add it to a list in C#从 json 字符串中提取信息并将其添加到 C# 中的列表中
【发布时间】:2018-07-24 00:59:34
【问题描述】:

我是 json 新手。我想要不同用户的信息并将它们添加到 c#(.net 开发)中的 dataGridViewdataTabledataSet 中。信息样本为(json有效):

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

我希望他们是这样的:


用户1 |杰索尔 |开发


用户2 |博格拉 |库马尔·赛卡特

如果我可以为所有这些人列出一份清单,那也会有所帮助。

我相信我能够通过
var model = JsonConvert.DeserializeObject<user>(json);

对它们进行反序列化(完全不确定)

其中用户是一个类。

 public class Item
{

    public string name;
    public string address;

}

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

【问题讨论】:

  • 我不明白这部分问题:但在我的情况下,我的属性是未知的,(字符串“User1”,“User2”将是随机的,因为我将从一个数据库)你能多说一些吗?
  • @John 我认为 OP 表示属性名称 JrPwbApfIHbQhCUmVIoiVJcPYv93iBRZAyn8TQTOgKTcByGOvJjL9ZB3
  • OP 我删除了你的 visual-studio 标签,因为这不是关于 Visual Studio IDE 的问题。

标签: c# .net json


【解决方案1】:

您正在查看 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上查看我的示例

【讨论】:

  • 短而精确!!非常感谢 John Wu 先生!!
【解决方案2】:

可以使用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” 或者它更容易,但应该是相当简单的代码。

请记住,我在那里使用“动态”,这意味着问题会在运行时而不是设计时出现,因为它没有被检查。

【讨论】:

  • 好吧,在我上面看到 John Wu 的评论后,这比我的解决方案要好得多。在这里作为示例,但请使用他的。
【解决方案3】:

正确的反序列化方式如下

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

在您发布的代码示例中,您的“user”类名称是 Item,但您正尝试使用“User”进行反序列化在你的代码中。另请注意,您不能直接将数据反序列化到用户列表中,因为它作为一些随机字符串的值存在。

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

为了让您的代码能够正确反序列化,您的 json 格式应如下所示:

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

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-19
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 2021-12-13
    • 2015-01-25
    相关资源
    最近更新 更多