I have a model which looks like that:
class Nested{ public string Name {get; set;} public int Id {get; set;} } class Model{ [JsonProperty] public Nested N {get; set;} public string Name {get; set;} public int Id {get; set;} }
and a markup for that is something like this:
<input asp-for="Name"> <input asp-for="id"> <input type="hidden" name="n" value="@JsonConvert.SerializeObject(new Nested())">
However when I posting this form back it fails on deserialization because N
field looks like encoded twice. So this code works:
var b = JsonConvert.DeserializeAnonymousType(model1, new { N = ""}); var c = JsonConvert.DeserializeObject<Nested>(b.N);
but this one fails:
var d = JsonConvert.DeserializeAnonymousType(model1, new {N = new Nested()});
What i need is to make it work with JsonConvert.DeserializeObject<Model>(model1)
. What should I change to make it work?
example:
{"name":"Abc","id":1,"n":"{\"id\":2,\"name\":\"BBB\"}"}
The same problem described in this question but I'm looking for an elegant, simple solution, which wasn't proposed.
4 Answers
Answers 1
class Nested{ public string Name {get; set;} public int Id {get; set;} } class Model{ [JsonProperty] public string N { get { return JsonConverter.DeserializeObject<Nested>(Nested); } set{ Nested = JsonConverter.SerializeObject(value); } } // Use this in your code [JsonIgnore] public Nested Nested {get;set;} public string Name {get; set;} public int Id {get; set;} }
Answers 2
I had similar issues but in the opposite direction (due to the EF proxies and that stuff, a long history)
But I'd say that this could be a good hint for you, I did this in my startup, on ConfigureServices method:
// Add framework services. services.AddMvc().AddJsonOptions(options => { // In order to avoid infinite loops when using Include<>() in repository queries options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore; });
I hope it helps you to solve your issue.
Juan
Answers 3
you can serialize it yourself with your own code, using Runtime.Serialization
something like this
[Serializable] class Model{ [JsonProperty] public Nested N {get; set;} public string Name {get; set;} public int Id {get; set;} protected Model(SerializationInfo info, StreamingContext context) { Name = info.GetString("Name"); Id = info.GetInt32("Id"); try { child = (Model)info.GetValue("N", typeof(Model)); } catch (System.Runtime.Serialization.SerializationException ex) { // value N not found } catch (ArgumentNullException ex) { // shouldn't reach here, type or name is null } catch (InvalidCastException ex) { // the value N doesn't match object type in this case (Model) } } }
once you use Model class as your parameter it will automatically use this serializer we just did.
Answers 4
try
var d = JsonConvert.DeserializeAnonymousType(model1, new {N = new Nested(), Name = "", Id = 0});
0 comments:
Post a Comment