Litedb: Need help: Parse downloaded json to class

Created on 3 Oct 2018  ·  2Comments  ·  Source: mbdavid/LiteDB

Hi!

I have a web server running with MongoDB, and I'm sending some data to an Android App that's using LiteDB. The data I send in Json have the following structure:

public class InitialData
{
    public List<Pais> Paises { get; set; }
    public List<Estado> Estados { get; set; }
    public List<Cidade> Cidades { get; set; }
    public List<Versao> Versoes { get; set; }
    public List<Gabinete> Gabinetes { get; set; }
}

And the Pais class or Estado class have the same structure as below (with minor changes, of course):

public class Pais
{
    public ObjectId Id { get; set; }
    public DateTime DataAtualizacao { get; set; }
    public string Sigla { get; set; }
    public string Nome { get; set; }
}

These classes are on Android project and the ObjectId property is a LiteDB.ObjectId type.

Can I "parse" the Mongo ObjectId to LiteDB ObjectId?
When I'm trying to deserialize it with Newtonsoft I have this error:

Newtonsoft.Json.JsonSerializationException: 'Error converting value "5bb4c335c52b0716b0c30317" to type 'LiteDB.ObjectId'. Path 'paises[0].id', line 1, position 43.'
Inner Exception:
ArgumentException: Could not cast or convert from System.String to LiteDB.ObjectId.

The Json looks like an attached sample:
SampleJson.txt

The question is:
How can I parse this data?

Thank you so much, and congratulations for the AMAZING job with this db. :)

Edit:
I tried the follow way but didn't work either way. 😢

var objeto = LiteDB.JsonSerializer.Deserialize(jsonResult);
var document = objeto.AsDocument;
var dados = BsonMapper.Global.ToObject<InitialData>(document);

Most helpful comment

Boa tarde, Maurício!

Primeiro, muito obrigado mesmo! Fiz como você instruiu e funcionou perfeitamente!
Eu criei um JsonConverter para o ObjectId e passei ele na deserialização do Json utilizando Newtonsoft.Json... se ajudar mais alguém no futuro, abaixo está o código do Converter:

    public class ObjectIdConverter : JsonConverter<ObjectId>
    {
        public override ObjectId ReadJson(JsonReader reader, Type objectType, ObjectId existingValue, bool hasExistingValue, Newtonsoft.Json.JsonSerializer serializer)
        {
            var id = reader.Value as string;
            return new ObjectId(id);
        }

        public override void WriteJson(JsonWriter writer, ObjectId value, Newtonsoft.Json.JsonSerializer serializer)
        {
            writer.WriteValue(value.ToString());
        }
    }

Segundo, o LiteDB está funcionando perfeitamente aqui no Xamarin.Forms, estou usando para mobile e funciona rápido demais.

Se eu puder ajudar em algo, saiba que pode contar comigo... sou programador .NET há pouco mais de um ano e já estudei bastante coisa e acho que consigo ajudar no que quiser/precisar.

Muito obrigado mesmo.
Parabéns novamente pelo trabalho.

Estarei fechando a Issue devido ao problema estar resolvido... se eu puder ajudar em algo, meu e-mail é [email protected]

Até mais.

All 2 comments

Boa tarde Hugo, vou no português que me facilita a vida. O que acontece é que, conforme teu JSON os campo de "id" está como String. O mesmo ocorre com o campo "Data", que está direto em string. Se tu quiser fazer parser usando o parser do LiteDB (JsonSerializer) estes campos precisam estar dentro deste formato:

https://github.com/mbdavid/LiteDB/wiki/Data-Structure#json-extended

Este formato é inspirado no proprio MongoDB JSON extended. Isso acontece porque o LiteDB não converte um JSON (string) em uma classe direto. Ele primeira converte em BsonDocument - e depois esse BsonDocument é que é convertido pra tua classe final (usando regras de mapeamento no BsonMapper)

Porem, no Newtonsoft.Json a historia é outra. O JSON.NET consegue fazer parse direto de um JSON (string) para o objeto final e com isso ele consegue converter uma string no tipo que tu precisa. Como o JSON.NET é muito mais flexivel do que o que fiz no LiteDB, é possivel criar conversores que conseguem detectar o tipo final e converter conforme a regra que tu precisa (JsonConverter). Aqui tem um bom exemplo de como dá pra fazer:

https://www.newtonsoft.com/json/help/html/CustomJsonConverterGeneric.htm

Ah, e valeu pelo elogio e por usar o LiteDB!

Boa tarde, Maurício!

Primeiro, muito obrigado mesmo! Fiz como você instruiu e funcionou perfeitamente!
Eu criei um JsonConverter para o ObjectId e passei ele na deserialização do Json utilizando Newtonsoft.Json... se ajudar mais alguém no futuro, abaixo está o código do Converter:

    public class ObjectIdConverter : JsonConverter<ObjectId>
    {
        public override ObjectId ReadJson(JsonReader reader, Type objectType, ObjectId existingValue, bool hasExistingValue, Newtonsoft.Json.JsonSerializer serializer)
        {
            var id = reader.Value as string;
            return new ObjectId(id);
        }

        public override void WriteJson(JsonWriter writer, ObjectId value, Newtonsoft.Json.JsonSerializer serializer)
        {
            writer.WriteValue(value.ToString());
        }
    }

Segundo, o LiteDB está funcionando perfeitamente aqui no Xamarin.Forms, estou usando para mobile e funciona rápido demais.

Se eu puder ajudar em algo, saiba que pode contar comigo... sou programador .NET há pouco mais de um ano e já estudei bastante coisa e acho que consigo ajudar no que quiser/precisar.

Muito obrigado mesmo.
Parabéns novamente pelo trabalho.

Estarei fechando a Issue devido ao problema estar resolvido... se eu puder ajudar em algo, meu e-mail é [email protected]

Até mais.

Was this page helpful?
0 / 5 - 0 ratings

Related issues

furesoft picture furesoft  ·  4Comments

thecodrr picture thecodrr  ·  4Comments

ghiboz picture ghiboz  ·  4Comments

muhamad picture muhamad  ·  3Comments

sandolkakos picture sandolkakos  ·  3Comments