将JSON字符串供应到自定义.NET对象



我的服务器具有很大的平原JSON,具有这样的格式

{ "A": 1, "B" : 2, "C" : 3 }

我无法更改格式。

,但没有做一个巨型

public class MegaClass
{
    public int A;
    public int B;
    public int C;
}

我想将一些属性分组到另一个对象,例如

public class MegaClass
{
    public int A;
    public SetOfVariables1 Set1;
}
public class SetOfVariables1
{
     public int B;
     public int C;
}

有没有方法可以做这项工作?

坏消息是,我想您不能动态地做到这一点。好消息是,您可以自己处理避免化并从那里生成您的对象。

我想您正在这样做是为了获得更好的结构,但是请注意,您必须写下自己的序列化器,原始结构。

我找到了两个选择来实现您要获得的结果。当谈到json.net时,我不是专业人士,实际上它对我来说是相当新的。

这是代码:

class Program
{
    static void Main(string[] args)
    {
        String json = "{ 'A': 1, 'B' : 2, 'C' : 3 }";
        var classA = JsonConvert.DeserializeObject<MegaClass>(json,new AConverter());
        var classA2 = JsonConvert.DeserializeObject<MegaClass2>(json);
    }
    public class MegaClass2
    {
        public int A { get; set; }
        public SetOfVariables SetOfVariables1 { get; set; }
        public MegaClass2()
        {
            _additionalData = new Dictionary<string, JToken>();
            SetOfVariables1 = new SetOfVariables();
        }
        [JsonExtensionData]
        private IDictionary<string, JToken> _additionalData;
        [OnDeserialized]
        private void OnDeserialized(StreamingContext context)
        {
            int b = (int)_additionalData["B"];
            int c = (int)_additionalData["C"];
            SetOfVariables1.B = b;
            SetOfVariables1.C = c;
        }
    }
    public class MegaClass
    {
        public int A { get; set; }
        public SetOfVariables SetOfVariables1 { get; set; }
    }
    public class SetOfVariables
    {
        public int B { get; set; }
        public int C { get; set; }
    }
    public class AConverter : CustomCreationConverter<MegaClass>
    {
        public override MegaClass Create(Type objectType)
        {
            throw new NotImplementedException();
        }
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            dynamic cl = serializer.Deserialize(reader);
            var classA = new MegaClass();
            classA.A = cl.A;
            var classB = new SetOfVariables();
            classB.B = cl.B;
            classB.C = cl.C;
            classA.SetOfVariables1 = classB;
            return classA;
        }
    }
}

所以这是描述:第一个选项使用CustomCreationConverter。我们可以将对象列为其原始表示形式,并从那里创建一个新的。

第二个选项似乎在我们的对象被启用后初始化。_additionaldata是由框架设置的,我们只是使用它来填充我们的对象。

我看到了第一个选项根据所提供的JSON创建不同的对象。例如,如果您具有a 类A 类B 以及两个扩展类C ,那么您可以在Overriden Create方法中确定,该方法对象可以对象进行应对化。

第一个选项受JSON.NET文档

的启发

最新更新