代码之家  ›  专栏  ›  技术社区  ›  Alex

JavaScriptSerializer问题

c#
  •  1
  • Alex  · 技术社区  · 14 年前

    所以我得到了谷歌翻译API的回复,如下所示:

    "{\"responseData\": {\"translatedText\":\"Hola Mi nombre es\"}, \"responseDetails\": null, \"responseStatus\": 200}"
    

    我的代码如下:

     private string getText(string response)
        {
            var serializer = new JavaScriptSerializer(new SimpleTypeResolver());
            translationReturnObject obj = serializer.Deserialize<translationReturnObject>(response);
    
            return obj.translatedText;
        }
    

    使用这样定义的translationReturnObject:

    [DataContract]
    class translationReturnObject
    {
        [DataMember(Name = "responseData")]
        public string repsonseData { get; set;}
    
        [DataMember(Name = "translatedText")]
        public string translatedText { get; set; }
    
        [DataMember(Name = "responseDetails")]
        public string responseDetails { get; set; }
    
        [DataMember(Name = "responseStatus")]
        public string responseStatus { get; set; }  
    
    }
    

    我的问题是translatedtext没有得到正确的反序列化。无论返回的语言是什么(所以我不认为这是编码问题),值都为空。

    我做错了什么有什么想法吗?

    2 回复  |  直到 14 年前
        1
  •  3
  •   TheCloudlessSky    14 年前

    如果你看到返回的JSON,你会看到 translatedText 是一个 财产 属于 responseData . 因此,您需要:

    public class TranslationResponseData
    {
        public string translatedText { get; set; }
    }
    
    public class TranslationReturnObject
    {
        public TranslationResponseData repsonseData { get; set;}
        public string responseDetails { get; set; }
        public string responseStatus { get; set; }  
    }
    

    编辑 :另外,你不必担心 DataContract / DataMember . JavaScriptSerializer 将JSON名称映射到公共属性名称。

        2
  •  0
  •   madcapnmckay    14 年前

    我不认为 JavaScriptSerializer 使用DataContract和DataMember属性。你试过使用 DataContractSerializer 班级?

    JavaScriptSerializer处理属性名本身。它被弃用了,但出于某种原因被重新用于MVC。DataContractSerializer已随WCF一起释放。