2010-08-12 4 views
1

SO Я получаю ответ от Google Translate API, как это:JavaScriptSerializer вопросы

"{\"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; } 

} 

Моя проблема в том, что translationText не получает десериализацию правильно. Независимо от того, какой язык возвращается (так что я не думаю, что это проблема с кодировкой), значение равно null.

Любые идеи о том, что я делаю неправильно?

+0

Почему странные имена? – marr75

+0

что с этим связано? не уверен, что вы получаете. – Alex

ответ

3

Если вы посмотрите на 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; } 
} 

EDIT: Кроме того, вам не нужно беспокоиться о DataContract/DataMember. JavaScriptSerializer сопоставит имя JSON с именем публичной собственности.

+0

Большое спасибо, это действительно проблема, и ваше исправление работает. Извините, если это похоже на ошибку n00b, но в json я n00b. – Alex

+0

@Alex - Не беспокойтесь. Вы просто должны быть очень осторожны при анализе JSON, особенно если * вы * не создали его. – TheCloudlessSky

+0

В этом случае ему не нужно беспокоиться о datacontract и datamember, но если он захочет переименовать некоторые свойства для сериализации или исключить некоторые, он понадобится. – richard

0

Я не думаю, что JavaScriptSerializer работает с атрибутами DataContract и DataMember. Вы пробовали использовать класс DataContractSerializer?

JavaScriptSerializer работает с именем самой собственности. Он был устаревшим, но по какой-то причине был воскрешен для MVC. DataContractSerializer был выпущен с WCF.

+0

Я не думаю, что «JavaScriptSerializer» никогда не устарел ... – TheCloudlessSky

+0

На самом деле это действительно работает, возможно, это не понадобится, как указывал CloudlessSky, но это просто отлично со всеми остальными. Конечно, я удалил его сейчас, чтобы сделать его более читаемым, поскольку он не нужен. Я добрался до того, как сделал другой ответ stackoverflow, и именно так они и сделали, поэтому я счел это необходимым. – Alex

+0

@TheCloudlessSky Я думал, что это было в 3.5, а затем не указано в 3.5 SP1. См. Здесь http://weblogs.asp.net/scottgu/archive/2007/10/01/tip-trick-building-a-tojson-extension-method -using-net-3-5.aspx scott упоминает это в комментариях. Сначала я попытался использовать его с DataMembers, и он полностью проигнорировал их. Может быть, я делал что-то неправильно. – madcapnmckay

Смежные вопросы