【发布时间】:2017-10-19 16:33:42
【问题描述】:
我有这门课:
class SoporteFile
{
public Evento[] eventos { get; set; }
public Programacion[] programaciones { get; set; }
public static Dictionary<int, object[]> soportes { get; set; }
}
然后我有Soporte
class Soporte
{
public Aviso[] avisos { get; set; }
public Placa[] placas { get; set; }
public Portada[] portadas { get; set; }
public Efemeride[] efemerides { get; set; }
public Comunicado[] comunicados { get; set; }
}
SoporteFile 中的 Dictionary 类应与 Soporte 类匹配。 soportes[0] 应该有一个 Aviso 数组,soportes[1] 应该有一个 Placa 数组等。当我用 Json.NET 解析它时,即使 Dictionary soportes 和 Soporte 类之间没有关系,我似乎也没有错误解析好(我不知道是不是这样),但是当我尝试像这样访问 Dictionary soportes 时(首先反序列化):
SoporteFile curContent = JsonConvert.DeserializeObject<SoporteFile>(File.ReadAllText(curFolder + @"/Contenido.json"));
curContent.soportes[0] 我收到一个错误(错误 CS0176 成员无法使用实例引用访问;改为使用类型名称对其进行限定)。如果我这样做SoporteFile.soportes[0] 我得到引用未建立为对象的实例(最后一个错误翻译自西班牙语,可能略有不同)。我做错了什么?
如果需要,这里是我尝试反序列化的 json:
{
"eventos": [
{
"id_evento": 5,
"id_calendario": 5,
"id_usuario": 1,
"fecha_carga": "2017-04-25 08:47:20",
"descripcion": "Mañanas",
"lugar": null,
"resumen": null,
"fecha_inicio": "2017-05-16",
"hora_inicio": "06:00:00",
"fecha_limite": "2017-05-16",
"hora_limite": "12:00:00",
"dia_completo": 0,
"id_estado": null,
"recordatorio": null,
"bloqueado": 0,
"id_programacion": 1,
"color": null
},
{
"id_evento": 8,
"id_calendario": 5,
"id_usuario": 1,
"fecha_carga": "2017-04-27 16:51:56",
"descripcion": "Tarde",
"lugar": null,
"resumen": null,
"fecha_inicio": "2017-05-16",
"hora_inicio": "12:00:00",
"fecha_limite": "2017-05-16",
"hora_limite": "20:00:00",
"dia_completo": 0,
"id_estado": null,
"recordatorio": null,
"bloqueado": 0,
"id_programacion": 1,
"color": null
},
{
"id_evento": 5,
"id_calendario": 5,
"id_usuario": 1,
"fecha_carga": "2017-04-25 08:47:20",
"descripcion": "Mañanas",
"lugar": null,
"resumen": null,
"fecha_inicio": "2017-05-17",
"hora_inicio": "06:00:00",
"fecha_limite": "2017-05-17",
"hora_limite": "12:00:00",
"dia_completo": 0,
"id_estado": null,
"recordatorio": null,
"bloqueado": 0,
"id_programacion": 1,
"color": null
},
{
"id_evento": 8,
"id_calendario": 5,
"id_usuario": 1,
"fecha_carga": "2017-04-27 16:51:56",
"descripcion": "Tarde",
"lugar": null,
"resumen": null,
"fecha_inicio": "2017-05-17",
"hora_inicio": "12:00:00",
"fecha_limite": "2017-05-17",
"hora_limite": "20:00:00",
"dia_completo": 0,
"id_estado": null,
"recordatorio": null,
"bloqueado": 0,
"id_programacion": 1,
"color": null
},
{
"id_evento": 5,
"id_calendario": 5,
"id_usuario": 1,
"fecha_carga": "2017-04-25 08:47:20",
"descripcion": "Mañanas",
"lugar": null,
"resumen": null,
"fecha_inicio": "2017-05-18",
"hora_inicio": "06:00:00",
"fecha_limite": "2017-05-18",
"hora_limite": "12:00:00",
"dia_completo": 0,
"id_estado": null,
"recordatorio": null,
"bloqueado": 0,
"id_programacion": 1,
"color": null
},
{
"id_evento": 8,
"id_calendario": 5,
"id_usuario": 1,
"fecha_carga": "2017-04-27 16:51:56",
"descripcion": "Tarde",
"lugar": null,
"resumen": null,
"fecha_inicio": "2017-05-18",
"hora_inicio": "12:00:00",
"fecha_limite": "2017-05-18",
"hora_limite": "20:00:00",
"dia_completo": 0,
"id_estado": null,
"recordatorio": null,
"bloqueado": 0,
"id_programacion": 1,
"color": null
}
],
"programaciones": [
{
"id_programacion": 1,
"nombre": "Programación estándar",
"tipo_corte": 1,
"duracion": null,
"soportes": [
{
"id_soporteprogramacion": 10,
"id_programacion": 1,
"soporte": 2,
"orden": null,
"cantidad": 10,
"duracion": null
},
{
"id_soporteprogramacion": 11,
"id_programacion": 1,
"soporte": 3,
"orden": 1,
"cantidad": 12,
"duracion": null
},
{
"id_soporteprogramacion": 12,
"id_programacion": 1,
"soporte": 1,
"orden": 2,
"cantidad": 5,
"duracion": null
},
{
"id_soporteprogramacion": 13,
"id_programacion": 1,
"soporte": 12,
"orden": 3,
"cantidad": 1,
"duracion": null
},
{
"id_soporteprogramacion": 14,
"id_programacion": 1,
"soporte": 7,
"orden": 4,
"cantidad": 5,
"duracion": null
},
{
"id_soporteprogramacion": 15,
"id_programacion": 1,
"soporte": 13,
"orden": 5,
"cantidad": 1,
"duracion": null
},
{
"id_soporteprogramacion": 16,
"id_programacion": 1,
"soporte": 8,
"orden": 6,
"cantidad": 10,
"duracion": null
}
]
}
],
"soportes": {
"2": [
{
"id_placa": 2,
"id_ref": 1,
"timestamp": "2017-05-16 19:38:35",
"id_region": 1,
"vigencia_desde": "2017-04-12 08:13:00",
"vigencia_hasta": "2018-04-12 08:13:00",
"duracion": 1,
"imagen": "17202847_10212332856146238_6497670072350234982_n.jpg",
"texto": "el texto",
"orden": 0,
"audio": null
},
{
"id_placa": 3,
"id_ref": 2,
"timestamp": "2017-05-16 19:38:35",
"id_region": 1,
"vigencia_desde": "2017-04-12 08:13:00",
"vigencia_hasta": "2018-04-12 08:13:00",
"duracion": 1,
"imagen": null,
"texto": "sin imagen",
"orden": 0,
"audio": null
}
],
"1": [
{
"id_aviso": 7,
"id_ref": 2,
"timestamp": "2017-05-16 19:38:35",
"id_region": 1,
"vigencia_desde": "2017-05-16 19:00:00",
"vigencia_hasta": "2018-05-16 23:59:00",
"titulo": "RENAULT MEGANE",
"id_categoriaaviso": 1,
"texto": "TEXTO DEL AVISO",
"contacto": null,
"imagen": null
},
{
"id_aviso": 8,
"id_ref": 4,
"timestamp": "2017-05-16 19:38:35",
"id_region": 1,
"vigencia_desde": "2017-05-16 19:00:00",
"vigencia_hasta": "2018-05-16 23:59:00",
"titulo": "FORD FOCUS",
"id_categoriaaviso": 1,
"texto": "FORD",
"contacto": null,
"imagen": "Apertura_2008_La_Capital_Rosario.jpg"
}
],
"13": {
"id_region": 1,
"timestamp": "2017-05-16 19:38:35",
"fecha": "2017-05-16",
"descripcion": "El aporte de aire húmedo desde el norte mantiene abundante nubosidad y menor amplitud térmica, mientras que sobre la región Patagónica ingresa un frente frío dando lugar a algunas precipitaciones y descenso de temperatura. "
},
"7": [
{
"id_portada": 1,
"timestamp": "2017-05-16 19:38:35",
"id_region": 1,
"nombre": "La nación",
"url": "\\1.jpg"
},
{
"id_portada": 2,
"timestamp": "2017-05-16 19:38:35",
"id_region": 1,
"nombre": "Clarín",
"url": "\\2.jpg"
}
],
"8": [
{
"id_efemeride": 6,
"id_ref": 2,
"timestamp": "2017-05-16 19:38:35",
"id_region": 1,
"fecha": "2017-05-17",
"titulo": "Día del enfermero 2",
"texto": "En enero de 1974, se tomó la decisión de celebrar una jornada conmemorativa de las contribuciones de los enfermeros a la sociedad, promovida por el Consejo Internacional de Enfermería, que se celebra en todo el mundo cada 12 de mayo, conmemorando el natalicio de Florence Nightingale, considerada \\\"fundadora\\\" de la enfermería moderna. Nacida en 1820, de fe anglicana, creía que Dios la había inspirado para ser enfermera. Alcanzó fama mundial por sus trabajos precursores de enfermería en la asistencia a los heridos durante la guerra de Crimea.",
"imagen": null,
"video": null,
"duracion": 10
}
]
}
}
编辑:我可能需要从字典中取出静态。如果我这样做,我会收到此错误:“无法将当前 JSON 对象(例如 {"name":"value"})反序列化为类型 'System.Object[]',因为该类型需要 JSON 数组(例如 [1, 2,3]) 才能正确反序列化。"
【问题讨论】:
-
反序列化如何知道在 soportes 中构建什么类型的对象?也许您需要使用 Dictionary
然后将其转换为您需要使用的任何内容。也想知道为什么你使用静态的 soportes。 -
如果我从字典中取出 STATIC,我会遇到反序列化问题:“无法将当前 JSON 对象(例如 {"name":"value"})反序列化为类型 'System.Object[]'因为该类型需要一个 JSON 数组(例如 [1,2,3])才能正确反序列化。”
-
@JeffDavies 我取出 STATIC 并放入 dynamic 而不是 object,得到上面写的反序列化错误
-
您发布的 json 缺少结束符 } : jsonlint.com
标签: c# json dictionary json.net json-deserialization