2015-02-05 97 views
1

你好:我有反序列化Json的问题: 这是我的JSON(字符串):C#:反序列化JSON列表

{[ 
    { 
    "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的Asignaturas列表。我正在尝试

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); 

这种情况下继续工作。

+3

你的JSON包含顶级两个项目:一个'Asignatura'对象+一组“Asignatura”对象。你可以修复它的结构只是一个数组?这会让你的反序列化代码起作用。 – MarcinJuraszek 2015-02-05 17:55:17

+1

@MarcinJuraszek你应该发布它作为答案:) – DixonD 2015-02-05 17:57:05

+0

@MarcinJuraszek假设他的JSON格式是固定的,是否有反序列化为2个元素列表的方式:第一个元素是一个“Asignatura”,第二个元素是一个'列表'? – 2015-02-05 17:58:35

回答

0

首先,我会联系web服务的所有者,告诉他们他们提供的JSON无效。

外部{...}那里目前意味着他们正在服务一个对象,但该对象没有键和值(这是必需的),它只是包装一个数组。

无论如何,你可以通过在字符串的开始和结尾修整{}来解决这个问题。然后,您剩下一个Array,其第一项是Asignatura,第二项是Asignatura的Array。

如果你只是想一个List<Asignatura>,最简单的方法可能是反序列化到一个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); 
+0

安德鲁完美的工作,你是一个天才。我试试这个返回一个列表'' '名单 listAsignaturas =新名单();'' = listAsignaturas(名单)signatureList;' 和工作,是好? – 2015-02-05 19:18:18

+0

这看起来不错,但我会更新代码,使'signatureList'成为'List '而不是那个,这将会更清洁。 – 2015-02-05 19:25:01

+0

@KevinF:请看我的更新,让我知道如果有帮助 – 2015-02-05 19:25:30

2

你的JSON字符串有2个数组,一个数组有一个“Asignatura”,它有另一个“Asignatura”嵌套数组。删除第二组“[]”括号。

+0

我无法删除任何内容,因为是webService的响应。 – 2015-02-05 18:06:39

+1

然后,您需要更改您要反序列化的对象。 特别是,您会得到,因此您阅读的对象需要添加到列表对象或其他东西上。 – 2015-02-05 18:09:10

+0

马特感谢您的回应,我编辑添加新课程的问题,但继续没有工作。 – 2015-02-05 18:17:50