-2

I'm using this library (FireSharp) to access Firebase. I've retrieved a json as the body of a FirebaseResponse (status and body basically), which works good and looks like this (all test data):

"{\"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}}}"

The Firebase struct looks like this, leafs with some params behind that. I need to deserialize the Json to embed it into a Object with several List params, one for each node behind 18500. I've checked this question and this is my code so far:

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

And the deserialization try...

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

This gives me a deesrialization error I can't understand, not really into jsons sorry, and thx in advanced!

{Newtonsoft.Json.JsonSerializationException: Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'System.Collections.Generic.List`1[Reparto_Android.Code.Helpers.FirebaseHelper+documentoFirebase]' because the type requires a JSON array (e.g. [1,2,3]) to deserialize correctly. To fix this error either change the JSON to a JSON array (e.g. [1,2,3]) or change the deserialized type so that it is a normal .NET type (e.g. not a primitive type like integer, not a collection type like an array or List) that can be deserialized from a JSON object. JsonObjectAttribute can also be added to the type to force it to deserialize from a JSON object. Path

1
  • 1
    Not a single one of those properties is correct. You don't have a list of Cobros, of Pedidos or of Repartidores, they are all single objects - just as the exception message tells you: "To fix this error either change the JSON to a JSON array (e.g. [1,2,3]) or change the deserialized type so that it is a normal .NET type (e.g. not a primitive type like integer, not a collection type like an array or List) that can be deserialized from a JSON object." Commented Dec 22, 2021 at 16:39

2 Answers 2

0

this code works properly

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

if you use these classes

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

output

{
  "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
    }
  }
}
Sign up to request clarification or add additional context in comments.

Comments

0

If all those leaf names, such as "1111", "1001", "1112", are dynamically generated and you want to ignore them, maybe you can try some customized json converters like below:

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

Then you can try to parse the raw json as what you did before:

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.