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