【问题标题】:Deserialize json string into a list of .NET objects将 json 字符串反序列化为 .NET 对象列表
【发布时间】:2019-11-29 03:30:40
【问题描述】:

要求

我正在尝试构建一个将 json 字符串作为输入的函数。并输出对象列表。 json 字符串的格式与此类似:

{\"custlist\":[{\"cust_name\":\"Vincent\",\"cust_id\":\"klq:206f387:2d08m92t6\"},{\"cust_name\":\"Joyce\",\"cust_id\":\"125g:1474grx:2d03t9dld\"}]}

我的搜索

有很多解决方案将 json 数组反序列化为对象列表,但数组从字符串的开头开始。即没有 \"custlist\": 部分

如果我们在 json 字符串中有 \"custlist\": 部分,那么这些解决方案就会中断。

我的代码

这是我的 C# 代码。它正在工作,但我必须使用正则表达式来匹配输入字符串。似乎过于复杂。必须有更简单的方法。有知道的请指教

    public void Test()
    {
        string str = {\"custlist\":[{\"cust_name\":\"Vincent\",\"cust_id\":\"klq:206f387:2d08m92t6\"},{\"cust_name\":\"Joyce\",\"cust_id\":\"125g:1474grx:2d03t9dld\"}]};

        List<Customer> list = Json2List<Customer>(str);
        foreach (Customer c in list)
        {
            console.writeline ("name=" + c.cust_name);
            console.writeline ("id=" + c.cust_id);
        }

    }


    public List<T> Json2List<T>(string s)
    {
        string json_listname = Regex.Match(s, "\"" + @"(\w+?)" + "\":").Groups[0].Value;
        JObject jObject = JObject.Parse(s);
        List<JToken> jTokenList = jObject.GetValue(json_listname).ToList();

        List<T> LstT = new List<T>();
        foreach (JToken jt in jTokenList)
        {
            T obj = jt.ToObject<T>();
            LstT.Add(obj);

        }

        return LstT;

    }

public class Customer
{
    public string cust_name { get; set; }
    public string cust_id { get; set; }

}

【问题讨论】:

  • 谷歌Newtonsoft.Json
  • .NET BCL 也有一个 DataContractJsonSerializer
  • @zaitsman,我已经在使用 newtonsoft.json。否则,我的代码中不会有 jObject 和 jToken 。虽然可能有更好的方法来使用它们,我正在寻找。

标签: c# json deserialization


【解决方案1】:

我真的不知道问题出在哪里,但本质上是:

public class CustomerList {
  [JsonProperty("custlist")]
   public Customer[] Customers { get; set; }
}

public class Customer
{
    [JsonProperty("cust_name")]
    public string Name { get; set; }

    [JsonProperty("cust_id")]
    public string Id { get; set; }
}

var sample = "{\"custlist\":[{\"cust_name\":\"Vincent\"},{\"cust_id\":\"klq206f3872d08m92t6\"},{\"cust_name\":\"Joyce\"},{\"cust_id\":\"125g1474grx2d03t9dld\"}]}";

var result = JsonConvert.DeserializeObject<CustomerList>(sample).Customers;
// Or!

var dictResult = JsonConvert.DeserializeObject<Dictionary<string, Customer[]>>(sample)["custlist"];

【讨论】:

  • 我尝试运行您的代码,但出现异常github.com/anirugu/cslearning/blob/master/q59098442.cs 你能确认我在这里遗漏了什么吗?
  • "解析属性名称后出现无效字符。应为 ':' 但得到:c. 路径 'custlist[1]',第 1 行,位置 40。"
  • @AnirudhaGupta 立即尝试。似乎当我复制您的样本时,添加了一些无关的“”字符;我编辑了示例,它的运行方式
  • @AnirudhaGupta 看来原始发帖人的 JSON 字符串中有无效的 JSON:\"\"cust_id\" -> ""cust_id" 哇。这个JSON其实有很多问题。
  • @zaitsman,对不起,我最初发布的示例字符串是错误的。我刚刚修好了。该解决方案完美运行。谢谢
【解决方案2】:

看起来它是一个存储在 JSON 字符串中的 JSON 对象。

所以首先将其反序列化为字符串,然后作为正确类型的列表。你可以同时使用JsonConvert.DeserializeObject:

更新: 我刚刚意识到 JSON 中的数组是 JSON 对象的一个​​属性,我在这里没有说明。我现在没有时间解决这个问题,但我希望你能明白。

public List<T> Json2List<T>(string s)
{
    string json_object = JsonConvert.DeserializeObject<string>(s);

    return JsonConvert.DeserializeObject<List<T>>(json_object);
}

但我也会研究为什么您获得的数据会像这样被双重序列化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-16
    • 2012-03-07
    • 2021-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-04
    相关资源
    最近更新 更多