如何将字符串反序列化为JSON?

时间:2019-06-27 21:13:03

标签: c# json serialization

这个想法是,我想获取我的字符串,将其转换为JSON对象,然后遍历results数组以提取所有id字段并将它们放在单独的数组中。

我已经尝试了多个“ C#字符串转换为JSON示例”,但是在这部分特定代码方面走得最远。

主要:

String myString = "{
  "total": 111,
  "token": "abcdefghijklmn",
  "results": [
    {
      "id": "001",
      "some_stuff": {
        "aValue": 0,
        "bValue": 1
      }
    },
    {
      "id": "001",
      "some_stuff": {
        "aValue": 0,
        "bValue": 1
      }
    },
    {
      "id": "001",
      "some_stuff": {
        "aValue": 0,
        "bValue": 1
      }
    },
  ],
  "whatdidido": {
    "iretrieved": "yes"
  }
}";

var list = JsonConvert.DeserializeObject<List<IdReturn>>(myString);

课程:

public class IdReturn
 {
  public int total { get; set; }
  public string token { get; set; }
  public List<Attribute> results { get; set; }
 }

public class results
 {
  public string id { get; set; }
  public string some_stuff { get; set; }
 }

预期结果是一个JSON对象,我可以将其用作:list.results [i] .id以获取每个id。我从上面的代码中得到的错误消息是:

  

未处理的异常:Newtonsoft.Json.JsonSerializationException:无法将当前JSON对象(例如{“ name”:“ value”})反序列化为类型'System.Collections.Generic.List`1 [myExample.IdReturn]',因为类型需要JSON数组(例如[1,2,3])才能正确反序列化。   要解决此错误,可以将JSON更改为JSON数组(例如[1,2,3]),也可以更改反序列化类型,使其成为普通的.NET类型(例如,不像整数这样的原始类型,也不像这样的集合类型数组或列表),可以从JSON对象反序列化。还可以将JsonObjectAttribute添加到类型中,以强制其从JSON对象反序列化。

1 个答案:

答案 0 :(得分:2)

首先,您的字符串未写为有效的C#,应该为:

        String myString = @"{
  ""total"": 111,
  ""token"": ""abcdefghijklmn"",
  ""results"": [
    {
      ""id"": ""001"",
      ""some_stuff"": {
        ""aValue"": 0,
        ""bValue"": 1
      }
},
    {
      ""id"": ""001"",
      ""some_stuff"": {
        ""aValue"": 0,
        ""bValue"": 1
      }
    },
    {
      ""id"": ""001"",
      ""some_stuff"": {
        ""aValue"": 0,
        ""bValue"": 1
      }
    },
  ],
  ""whatdidido"": {
    ""iretrieved"": ""yes""
  }
}";

接下来,您需要一组classes to represent the JSON结构:

public class Rootobject
{
    public int total { get; set; }
    public string token { get; set; }
    public Result[] results { get; set; }
    public Whatdidido whatdidido { get; set; }
}

public class Whatdidido
{
    public string iretrieved { get; set; }
}

public class Result
{
    public string id { get; set; }
    public Some_Stuff some_stuff { get; set; }
}

public class Some_Stuff
{
    public int aValue { get; set; }
    public int bValue { get; set; }
}

最后要反序列化并打印每个id,您可以执行以下操作:

var root = JsonConvert.DeserializeObject<Rootobject>(myString);
Console.WriteLine(string.Join(",", root.results.Select(item => item.id)));

对于您的示例,这将导致:

001,001,001