none
关于Json的反序列化问题 RRS feed

  • 问题

  • Code Snippet

    {
     "d":[
     {
     "__type":"Demo:#SAW_WebService",
     },

     {
     "__type":"Demo:#SAW_WebService",
     },

     {
     "__type":"Demo:#SAW_WebService",
     }
    }

     

     

    上面Json范例中我的__type怎么声明他才能让我反序列化成功得到泛型?

     

    编译时显示下面错误:

    元素“:item”含有“Demo[:#]SAW_WebService”数据协定的数据。反序列化程序不知道映射到此协定的类型。请将与“Demo[:#]SAW_WebService”对应的类型添加到已知类型的列表中,例如,通过使用 KnownTypeAttribute 属性或通过将其添加到传递给 DataContractSerializer 的已知类型的列表等方法。

    2008年12月5日 15:20
    版主

答案

  •  

    八爪熊 : 是不是你的数据成员命名为“__type”,因为它可能与类型提示发生冲突。下面是MSDN上摘录的一段:

     

    -------------------------------------------------------------------------------------------------------------------------------

     

    若要保留类型标识,可以在将复杂类型序列化为 JSON 时添加“类型提示”。这样,反序列化程序在识别该提示后,便可以执行相应的操作。“类型提示”是一个键名为“__type”(两个下划线,后跟单词“type”)的 JSON 键/值对。该值是一个 JSON 字符串,其形式为“数据协定名称:数据协定命名空间”(第一个冒号前的所有内容都是名称)。在前面的示例中,“Circle”可以按以下方式进行序列化。

     
    {"__type":"Circle:http://example.com/myNamespace","x":50,"y":70,"radius":10}
     

    类型提示与 xsi:type 属性非常相似,此属性由 XML 架构实例标准定义,供序列化/反序列化 XML 时使用。

     

    禁止将数据成员命名为“__type”,因为它可能与类型提示发生冲突。

     

    2008年12月6日 5:12
    版主
  • 最后一次爬高楼= .=

    经多方查阅仍无解....只有Regex.Replace把那些__type换掉了

    依旧期待答案

     

    2008年12月7日 13:08
    版主

全部回复

  • 只在msdn找到

    http://msdn.microsoft.com/zh-cn/library/bb412170.aspx

    但是没说怎么把它反序列化

     

    2008年12月5日 16:17
    版主
  • 被__type打败 哪位帅哥知道如何用 DataContractJsonSerializer 反序列化这个东东,貌似要声明称var类型,真不明白了...
    2008年12月5日 17:38
    版主
  • 不支持泛型的吧

    2008年12月6日 2:18
    版主
  •  

    如果没有__type,我会直接反序列化成泛型
    2008年12月6日 2:28
    版主
  •  

    八爪熊 : 是不是你的数据成员命名为“__type”,因为它可能与类型提示发生冲突。下面是MSDN上摘录的一段:

     

    -------------------------------------------------------------------------------------------------------------------------------

     

    若要保留类型标识,可以在将复杂类型序列化为 JSON 时添加“类型提示”。这样,反序列化程序在识别该提示后,便可以执行相应的操作。“类型提示”是一个键名为“__type”(两个下划线,后跟单词“type”)的 JSON 键/值对。该值是一个 JSON 字符串,其形式为“数据协定名称:数据协定命名空间”(第一个冒号前的所有内容都是名称)。在前面的示例中,“Circle”可以按以下方式进行序列化。

     
    {"__type":"Circle:http://example.com/myNamespace","x":50,"y":70,"radius":10}
     

    类型提示与 xsi:type 属性非常相似,此属性由 XML 架构实例标准定义,供序列化/反序列化 XML 时使用。

     

    禁止将数据成员命名为“__type”,因为它可能与类型提示发生冲突。

     

    2008年12月6日 5:12
    版主
  •  Daniel Chow (周建春) 写:

     

    八爪熊 : 是不是你的数据成员命名为“__type”,因为它可能与类型提示发生冲突。下面是MSDN上摘录的一段:

     

    -------------------------------------------------------------------------------------------------------------------------------

     

    若要保留类型标识,可以在将复杂类型序列化为 JSON 时添加“类型提示”。这样,反序列化程序在识别该提示后,便可以执行相应的操作。“类型提示”是一个键名为“__type”(两个下划线,后跟单词“type”)的 JSON 键/值对。该值是一个 JSON 字符串,其形式为“数据协定名称:数据协定命名空间”(第一个冒号前的所有内容都是名称)。在前面的示例中,“Circle”可以按以下方式进行序列化。

     
    {"__type":"Circle:http://example.com/myNamespace","x":50,"y":70,"radius":10}
     

    类型提示与 xsi:type 属性非常相似,此属性由 XML 架构实例标准定义,供序列化/反序列化 XML 时使用。

     

    禁止将数据成员命名为“__type”,因为它可能与类型提示发生冲突。

     

     

    不是呀,是人家的wcf提供的json里面带有__type说明类,我想用.net给他反序列化成泛型.

    Code Snippet

    {"d":[{"__type":"Location:#SAW_WebService","location_id":32,"region":"default","country_code":"AR","country":"Argentina","parent_location_id":null},{"__type":"Location:#SAW_WebService","location_id":36,"region":"default","country_code":"AU","country":"Australia","parent_location_id":null},{"__type":"Location:#SAW_WebService","location_id":40,"region":"default","country_code":"AT","country":"Austria","parent_location_id":null}

    ]}

     

     

    如上面的这个json,我在.net里面怎么样才能把他反序列化,如果没有"__type":"Location[:#]SAW_WebService",我直接DataContractJsonSerializer到一个Location的list就行了,现在有这个__type就显示错误了

     

    2008年12月6日 6:25
    版主
  • 最后一次爬高楼= .=

    经多方查阅仍无解....只有Regex.Replace把那些__type换掉了

    依旧期待答案

     

    2008年12月7日 13:08
    版主