tags:

views:

207

answers:

1

I am trying to populate a C# object (ImportedProductCodesContainer) with data using JSON.NET deserialization.

ImportedProductCodesContainer.cs:

using Newtonsoft.Json;

[JsonObject(MemberSerialization.OptOut)]
public class ImportedProductCodesContainer
{
    public ImportedProductCodesContainer()
    {

    }

    [JsonProperty]
    public ActionType Action { get; set; }

    [JsonProperty]
    public string ProductListRaw { get; set; }


    public enum ActionType {Append=1, Replace};
}

JSON string:

{"ImportedProductCodesContainer":{"ProductListRaw":"1 23","Action":"Append"}}

C# Code:

 var serializer = new JsonSerializer();
 var importedProductCodesContainer = 
     JsonConvert.DeserializeObject<ImportedProductCodesContainer>(argument);

The problem is that importedProductCodesContainer remains empty after running the code above (Action = 0, ProductListRaw = null). Can you please help me figure out what's wrong?

+1  A: 

You have one too many levels of ImportedProductCodesContainer. It's creating a new ImportedProductCodesContainer object (from the templated deserializer) and then attempting to set a property on it called ImportedProductCodesContainer (from the top level of your JSON) which would be a structure containing the other two values. If you deserialize the inner part only

{"ProductListRaw":"1 23","Action":"Append"}

then you should get the object you're expecting, or you can create a new struct with an ImportedProductCodesContainer property

[JsonObject(MemberSerialization.OptOut)]
public class ImportedProductCodesContainerWrapper
{
    [JsonProperty]
    public ImportedProductCodesContainer ImportedProductCodesContainer { get; set; }
}

and template your deserializer with that then your original JSON should work.

It may also be possible to change this behaviour using other attributes / flags with that JSON library but I don't know it well enough to say.

Rup
Thanks, that worked!
Alt_Doru