如何将 JSON 反序列化为具有多个列表参数的 .NET 对象<T>?



我正在使用此库(FireSharp(访问Firebase。我检索了一个json作为FirebaseResponse的主体(基本上是状态和主体(,它运行良好,看起来像这样(所有测试数据(:

"{"Cobros":{"1001":{"Estado":"Cobrado","Repartidor":124},"1112":{"Estado":"Pendiente","Repartidor":124}},"Pedidos":{"1111":{"Estado":"Entregado","Repartidor":123}},"Repartidores":{"123":{"ID Android":"asdadada","Terminal":123},"124":{"ID Android":"dggrefawe","Terminal":124}}}"

Firebase结构看起来像这样,叶子后面有一些params。我需要反序列化Json,将其嵌入到一个具有多个List参数的对象中,18500后面的每个节点都有一个List参数。我已经检查了这个问题,这是我到目前为止的代码:

public class cargaFirebase
{
[JsonProperty("Cobros")]
public List<documentoFirebase> carfb_cobros { get; set; }
[JsonProperty("Pedidos")]
public List<documentoFirebase> carfb_pedidos { get; set; }
[JsonProperty("Repartidores")]
public List<repartidorFirebase> carfb_repartidores { get; set; }
}

反序列化尝试。。。

FirebaseResponse resp = fbClient.Get(request);
cargaFirebase carga_res = JsonConvert.DeserializeObject<cargaFirebase>(resp.Body);

这给了我一个我无法理解的错误,没有真正进入jsons抱歉,并且thx在高级!

{Newtonsoft.Json.JsonSerializationException:无法将当前Json对象(例如,{"name"value"反序列化为类型"System.Collections.Generic.List`1[Reparto_Android.Code.Helpers.FirebaseHelper+documentoFirebase]",因为该类型需要JSON数组(例如[1,2,3](才能正确反序列化。要修复此错误,请将JSON更改为JSON数组(例如[1,2,3](,或者更改反序列化的类型,使其成为可以从JSON对象反序列化的普通.NET类型(例如,不是像integer这样的基元类型,也不是像array或List这样的集合类型(。JsonObjectAttribute也可以添加到类型中,以强制它从JSON对象反序列化。路径

此代码正常工作

cargaFirebase carga_res = JsonConvert.DeserializeObject<CargaFirebase>(resp.Body);

如果你使用这些类

public partial class CargaFirebase
{
[JsonProperty("Cobros")]
public Dictionary<string, Cobro> Cobros { get; set; }
[JsonProperty("Pedidos")]
public Pedidos Pedidos { get; set; }
[JsonProperty("Repartidores")]
public Dictionary<string, Repartidore> Repartidores { get; set; }
}
public partial class Cobro
{
[JsonProperty("Estado")]
public string Estado { get; set; }
[JsonProperty("Repartidor")]
public long Repartidor { get; set; }
}
public partial class Pedidos
{
[JsonProperty("1111")]
public Cobro The1111 { get; set; }
}
public partial class Repartidore
{
[JsonProperty("ID Android")]
public string IdAndroid { get; set; }
[JsonProperty("Terminal")]
public long Terminal { get; set; }
}

输出

{
"Cobros": {
"1001": {
"Estado": "Cobrado",
"Repartidor": 124
},
"1112": {
"Estado": "Pendiente",
"Repartidor": 124
}
},
"Pedidos": {
"1111": {
"Estado": "Entregado",
"Repartidor": 123
}
},
"Repartidores": {
"123": {
"ID Android": "asdadada",
"Terminal": 123
},
"124": {
"ID Android": "dggrefawe",
"Terminal": 124
}
}
}

如果所有这些叶名称,如"1111"1001"1112";,是动态生成的,如果你想忽略它们,也许你可以尝试一些定制的json转换器,如下所示:

public class CargaFirebase
{
[JsonConverter(typeof(DocumentoFirebaseConverter))]
public List<DocumentoFirebase> Cobros { get; set;}
[JsonConverter(typeof(DocumentoFirebaseConverter))]
public List<DocumentoFirebase> Pedidos { get; set;}
[JsonConverter(typeof(RepartidorFirebaseConverter))]
public List<RepartidorFirebase> Repartidores { get; set; }
}
public class DocumentoFirebase
{
public string Estado { get; set; }
public int Repartidor { get; set; }
}
public class RepartidorFirebase
{
[JsonProperty(PropertyName = "Id Android")]
public string Id_Android { get; set; }
public int Terminal { get; set; }
}
class DocumentoFirebaseConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(List<DocumentoFirebase>);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var jObj = JObject.Load(reader);
List<DocumentoFirebase> docs = new List<DocumentoFirebase>();
foreach (JProperty prop in jObj.Properties())
{
var doc = prop.Value.ToObject<DocumentoFirebase>();
docs.Add(doc);
}
return docs;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
class RepartidorFirebaseConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(List<RepartidorFirebase>);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var jObj = JObject.Load(reader);
List<RepartidorFirebase> repartidors = new List<RepartidorFirebase>();
foreach (JProperty prop in jObj.Properties())
{
var repartidor = prop.Value.ToObject<RepartidorFirebase>();
repartidors.Add(repartidor);
}
return repartidors;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}

然后,您可以尝试像以前那样解析原始json:

cargaFirebase carga_res = JsonConvert.DeserializeObject<CargaFirebase>(resp.Body);

最新更新