【问题标题】:C#: Deserialize JSON ListC#:反序列化 JSON 列表
【发布时间】:2015-02-05 17:53:20
【问题描述】:

嗨:我有反序列化 Json 的问题: 这是我的 Json(String):

{[
  {
    "IdGuid": "fac5d174-17d4-4330-a65e-07133e88e0ca",
    "Nombre": "Asignaturas",
    "Subtitulo": "Subtitulo de asignaturas",
    "Descripcion": "Descripcion de asignaturas",
    "urlFoto": "egio1.jpg"
  },
  [
    {
      "IdGuid": "a9a59e49-c318-4868-93a9-57347b4c4cad",
      "Nombre": "Ciencias Naturales",
      "Subtitulo": "",
      "Descripcion": "Ciencias",
      "urlFoto": "80.jpg"
    },
    {
      "IdGuid": "8ae0dc90-aa6a-4457-8e64-5f591f75416c",
      "Nombre": "Documentos",
      "Subtitulo": "",
      "Descripcion": "",
      "urlFoto": "asd.jpg"
    },
    {
      "IdGuid": "2ffbe004-316d-4a82-b4fe-0c43169766ad",
      "Nombre": "Inglés",
      "Subtitulo": "",
      "Descripcion": "",
      "urlFoto": "http://pue.jpg"
    },
    {
      "IdGuid": "62151f5c-f503-48a6-9801-c27e92aa240a",
      "Nombre": "Matemática",
      "Subtitulo": "",
      "Descripcion": "",
      "urlFoto": "http://pue.jpg"
    }
  ]
]}  

这是我的课:

public class Asignatura
    {
        public String idGuid { get; set; }

        public String nombre { get; set; }

        public String subtitulo { get; set; }

        public String descripcion { get; set; }

        public String urlFoto { get; set; }
    }

我需要使用 de JSON 生成一个签名列表。我正在尝试

List<Asignatura> listaAsignaturas = new List<Asignatura>();
listaAsignaturas= JsonConvert.DeserializeObject<List<Asignatura>>(json);

但不工作。

  • 请帮帮我。
  • 我正在使用 Newtonsoft.Json

(编辑) 添加类:

public class rootAsignatura
{
    public Asignatura raiz;
    public List<Asignatura> listaAsignaturas;
}

并尝试:

rootAsignatura listaAsignaturas = new rootAsignatura();
listaAsignaturas = JsonConvert.DeserializeObject<rootAsignatura>(json);

这继续没有工作。

【问题讨论】:

  • 您的 JSON 在顶层包含两个项目:一个 Asignatura 对象 + 一个 Asignatura 对象数组。你能把它的结构改成一个数组吗?这将使您的反序列化代码工作。
  • @MarcinJuraszek 你应该把它作为答案发布:)
  • @MarcinJuraszek 假设他的 JSON 格式是固定的,有没有办法将其反序列化为 2 个元素的列表:第一个元素是 Asignatura,第二个元素是 List&lt;Asignatura&gt;
  • 我不能删除任何东西,因为是 webService 的响应

标签: c# json class json-deserialization


【解决方案1】:

您的 JSON 字符串有 2 个数组,其中一个数组带有一个“Asignatura”,后者具有另一个嵌套数组“Asignatura”。删除第二组“[]”括号。

【讨论】:

  • 我无法删除任何内容,因为是 webService 的响应。
  • 然后你需要改变你要反序列化的对象。特别是,您会获得 的列表,因此您读取的对象需要添加到 List 对象或其他东西上。
  • 马特感谢您的回复,我编辑了添加新课程的问题,但继续没有工作。
  • 我很确定网络服务器提供了无效的 JSON,应该联系服务所有者。另外,Andrew Whitaker 有一个合理的解决方案。
【解决方案2】:

首先,我会联系网络服务的所有者并告诉他们他们提供的 JSON 格式无效。

当前存在的外部{...} 表示它们正在服务一个对象,但该对象没有键和值(这是必需的),它只是包装了一个数组。

无论如何,您可以通过删除字符串开头和结尾的{} 来解决这个问题。然后你会得到一个数组,它的第一项是Asignatura,第二项是Asignaturas 的数组。

如果你只想要一个List&lt;Asignatura&gt;,最简单的方法可能是反序列化为JArray,然后解析各个元素:

/* Parse the underlying array after removing the opening and closing braces */
var array = JArray.Parse(json.Trim('{', '}'));

/* Deserialize the first item in the array */  
var signatureOne = array[0].ToObject<Asignatura>();

/* Deserialize the second item in the array as a List<Asignatura> */
List<Asignatura> signatureList = array[1].ToObject<List<Asignatura>>();

/* Add the first item to the array. You could also use Insert(0, signatureOne) to 
 * put it at the front. */
signatureList.Add(signatureOne);

【讨论】:

  • 安德鲁这个作品完美,你是个天才。我尝试返回 List&lt;Asignatura&gt; List&lt;Asignatura&gt; listAsignaturas = new List&lt;Asignatura&gt;(); listAsignaturas = (List&lt;Asignatura&gt;)signatureList; 并工作,好吗?
  • 这看起来不错,但我会更新代码以将signatureList 改为List&lt;Asignatura&gt;,这样会更简洁一些。
  • @KevinF:请查看我的更新,如果有帮助请告诉我
  • 这项工作完美,我只有一个问题......为什么在解决方案中使用json.Trim('{', '}')
  • @KevinF:当然,因为使用{} 表示JSON 中的对象。对象有一个very specific definition in JSON,特别是它们是一组无序的键/值对。在您的示例中,{...} 内的数据 包含键/值对,它包含一个数组,因此它是无效的 JSON。使其有效的最简单方法是简单地删除外部{...}
猜你喜欢
  • 1970-01-01
  • 2012-08-26
  • 1970-01-01
  • 1970-01-01
  • 2016-05-30
  • 1970-01-01
  • 2018-02-11
  • 1970-01-01
相关资源
最近更新 更多