2011-08-14 14 views
2

System.Runtime.Serialization.Jsonライブラリを使用してJSONを解析しようとしています。ドキュメントは少し散っているように見えますが、私が必要とするものを達成する方法については混乱しています。ここに私が解析する必要のあるJSONのフォーマットがあります。Parse Google Translate Json C#

{ 
"data": { 
    "translations": [ 
    { 
    "translatedText": "ne", 
    "detectedSourceLanguage": "en" 
    } 
    ] 
} 
} 
+0

あなたのコードを投稿してください。 – Oded

答えて

1

ここには、JSONのデータ構造を表す一連のクラスがあります。タイプをJSON文字列内の場所と関連付けるのに役立つ名前を選択しました。

[DataContract] 
class RootObject 
{ 
    [DataMember(Name = "data")] 
    public DataObject Data { get; set; } 
} 

[DataContract] 
class DataObject 
{  
    [DataMember(Name="translations")] 
    public List<Translation> Translations { get; set; } 
} 

[DataContract] 
class Translation 
{ 
    [DataMember(Name = "translatedText")] 
    public string TranslatedText { get; set; } 
    [DataMember(Name = "detectedSourceLanguage")] 
    public string DetectedSourceLanguage { get; set; } 
} 

次に、JSON文字列をこの構造体にデシリアライズする例を示します。

string json = @" 
    { 
     ""data"": { 
     ""translations"": [ 
          { 
          ""translatedText"": ""ne"", 
          ""detectedSourceLanguage"": ""en"" 
          } 
         ] 
       } 
    }"; 

    var jsonSerializer = new DataContractJsonSerializer(typeof(RootObject)); 
    var o = (RootObject)jsonSerializer.ReadObject(
    new MemoryStream(Encoding.Unicode.GetBytes(json))); 
+0

'DataContractJsonSerializer'は' Name'のような 'DataMember'属性の設定を受け入れますか?私はこれまでに問題があった(これは私だけかもしれない:))、私は 'Name'プロパティを考慮していない場所を見て、" TranslatedText "を使用してそのオブジェクトをシリアライズします"translatedText" 'DataMember'属性を守ってJSON.NETを使用してしまいました。 –

+0

@David、私は上記のコードでシリアル化をテストし、期待どおりにDataMemberAttribute.Nameプロパティを受け入れました。 –

1
bool Clear(string str, out string res) 
    { 
     var ind = str.IndexOf("[[[\""); 

     if (ind == -1) 
     { 
      res = ""; 
      return false; 
     } 

     int end = str.IndexOf("[\"\",,,", ind + 1); 

     if (end == -1) 
     { 
      res = ""; 
      return false; 
     } 

     res = str.Substring(ind + 2, end - ind); 

     var arr = res.Split(new[] {"\",\"", "\"],[\"", "[\"", "\"]"}, StringSplitOptions.RemoveEmptyEntries); 

     res = ""; 

     for (int i = 0; i < arr.Length; i += 2) 
     { 
      res += arr[i]; 
     } 

     return true; 
    } 
    void TranslateText(string src_lang, string dst_lang) 
    { 
     var input = "Some request text"; 

     var url = String.Format("https://translate.google.ru/translate_a/single?client=t&sl={0}&tl={1}&hl={1}&dt=bd&dt=ex&dt=ld&dt=md&dt=qc&dt=rw&dt=rm&dt=ss&dt=t&dt=at&dt=sw&ie=UTF-8&oe=UTF-8&oc=2&otf=1&trs=1&inputm=1&ssel=0&tsel=0&pc=1&q={2}", src_lang, dst_lang, input); 
     var webClient = new WebClient{Encoding = Encoding.UTF8}; 

     webClient.DownloadStringCompleted += (sender, args) => 
     { 
      string res; 

      if (args.Error != null) 
      { 
       MessageBox.Show(args.Error.Message); 

       stoped = true; 

       return; 
      } 

      if (Clear(args.Result, out res)) 
      { 

      } 
     }; 

     webClient.DownloadStringAsync(new Uri(url), "your state"); 
    }