UWP:使用DataContractJsonSerializer的嵌套自定义类型

时间:2016-02-16 06:54:33

标签: json win-universal-app datacontractjsonserializer

我正在创建一个带有原始数据类型的嵌套自定义类型。 我有一个Web APi,它返回JSON中的数据。 使用json2csharp.com,我正在为它生成类。

我使用DataMember和带有DataContract的类型修饰了所有类中的原始数据类型。

我使用以下代码进行反序列化:

var resp = httpClient.GetAsync("http://ACTUAL_API_URI").Result;
var res = await resp.Content.ReadAsStringAsync();
var serializer = new DataContractJsonSerializer(typeof(RootObject));
byte[] byteArr= Encoding.ASCII.GetBytes(res);
var ms = new MemoryStream(byteArr);
var deserializedObj= (RootObject)serializer.ReadObject(ms);

我没有得到任何例外。但是deserializedObj对所有属性都有空值。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

你有几个错误。

  1. 您返回元素集合并尝试反序列化一个元素而不是集合

    public IEnumerable<SampleData> Get()
    {
        return new SampleData[]
        {
            new SampleData()
            {
                Value = 100,
                NestedTypeObject1 = new NestedType1()
                {
                    ID = 101,
                    BD = "Description#1",
                    UD = "Description#2"
                },
                NestedTypeObject2 = new NestedType2()
                {
                    Date = DateTime.Now.ToString(),
                    S1 = "S1 String",
                    S2 = "S2 String"
                }
            }
        };
    }
    

    所以你只需将代码更改为

    var serializer = new DataContractJsonSerializer(typeof(List<RootObject>));
    var deserializedObj= (List<RootObject>)serializer.ReadObject(ms);
    
  2. 您在服务端和客户端之间有不同的型号名称,只有您的SampleData型号,一切都会很好。您必须将MyNestedType1重命名为NestedTypeObject1或将名称添加到DataContractAttribute,例如:

    [DataContract(Name = "NestedTypeObject1")]
    public class MyNestedType1
    {
        [DataMember]
        public int Id { get; set; }
        [DataMember]
        public string BD { get; set; }
        [DataMember]
        public string UD { get; set; }
    }
    

    它也属于属性名称。