【问题标题】:UWP: Nested Custom Types with DataContractJsonSerializerUWP:使用 DataContractJsonSerializer 嵌套自定义类型
【发布时间】:2016-02-16 06:54:32
【问题描述】:

我正在使用原始数据类型创建嵌套自定义类型。 我有一个以 JSON 格式返回数据的 Web APi。 使用 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 的所有属性都有空值。

有什么建议吗?

【问题讨论】:

  • 你能提供api url吗?我猜你的RootObject 班级有问题
  • 请找出使用的类型: [DataContract] public class MyNestedType1 { [DataMember] public int Id { get;放; } [DataMember] 公共字符串 BD { 获取;放; }[DataMember] 公共字符串 UD { 获取;放; } } [DataContract] public class MyNestedType2 { [DataMember] public string Date { get;放; }[DataMember] 公共字符串 U1 { 获取;放; } [DataMember] 公共字符串 D1 { 获取;放; } } [DataContract] public class RootObject{[DataMember] public int Value { get;放; }[DataMember] public MyNestedType1 ObjectType1 { get;放; }[DataMember] public MyNestedType2 ObjectType2 { get;放; } }
  • 另外,创建了一个简单的服务和合约如下:
  • [DataContract] public class NestedType1{ [DataMember] public int ID { get;放; } [DataMember] 公共字符串 BD { 获取;放; } [DataMember] 公共字符串 UD { 获取;放; }}[DataContract] public class NestedType2 {[DataMember] public string Date { get;放; } [DataMember] 公共字符串 S1 { 获取;放; } [DataMember] 公共字符串 S2 { 获取;放; }}[DataContract] public class SampleData{ [DataMember] public int Value { get;set; } [DataMember] public NestedType1 NestedTypeObject1 { get;set; }[DataMember] public NestedType2 NestedTypeObject2 { get;设置;}}
  • 服务如下: public IEnumerable 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" } } }; }

标签: json win-universal-app datacontractjsonserializer


【解决方案1】:

你有几个错误。

  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; }
    }
    

    它也属于属性名称。

【讨论】:

  • 谢谢。我认为 WebAPi 的 Get 方法中 IEnumerable 的返回类型是症结所在。当它返回一个集合时,必须使用反序列化“数据类型的集合”。通过此更改,它能够获取值。不需要属性名称装饰。没有它也能正常工作。
猜你喜欢
  • 1970-01-01
  • 2022-01-11
  • 2016-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-17
  • 1970-01-01
相关资源
最近更新 更多