使用DataContractJsonSerializer在C#中反序列化JSON

时间:2017-01-28 17:48:30

标签: c# .net json deserialization

我的课程看起来像这样:

[DataContract]
public class Student {
    [DataMember(Name="name")]
    public string Name {get;set}

    [DataMember(Name="classes")]
    public List<Class> Classes {get; set;}

    public Dictionary<string, object> StudentRawDictionary {get; set;}
}

[DataContract]
public class Class {
    [DataMember(Name="id")]
    public int Id {get;set;}

    public Dictionary<string, object> ClassRawDictionary {get; set;}
}

这就是我反序列化的方式:

using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(json)))
{
    var settings = new DataContractJsonSerializerSettings {UseSimpleDictionaryFormat = true};
    var serializer = new DataContractJsonSerializer(typeof(Student), settings);
    var student = (Student) serializer.ReadObject(ms);

    ms.Seek(0, SeekOrigin.Begin);
    serializer = new DataContractJsonSerializer(typeof(Dictionary<string, object>), settings);
    var results = (Dictionary<string, object>) serializer.ReadObject(ms);
    student.RawDictionary = results;
    return student;
}

我的JSON看起来像这样:

{
    'name' : 'John Doe',
    'email' : 'johndoe@example.com',
    'classes': [
        {
            'id': 1,
            'name': 'History'
        },
        {
            'id': 2,
            'name': 'Music'
        }
    ]
}

问题: 如您所见,我的JSON可能包含明确列出和注释DataMember之外的字段(例如电子邮件)。我想要的是把所有的字段,无论它们是&#34;列出&#34;或不,在xRawDictionary对象中。这适用于Student对象 - 我可以毫无问题地获得Name字段。但是我没有考虑如何将所有字段添加到ClassRawDictionary

只有.net而没有其他外部依赖项才可能吗? (我正在编写一个开源库,所以我希望尽可能减少依赖关系,以便我不能使用Json.net。)

0 个答案:

没有答案