2016-12-27 5 views
0

Я следующий код (который работает), чтобы десериализации сырье JSON, полученные от веб-вызова:десериализации в DataContract из строкового значения в памяти

public static async Task<Example> GetExample() { 
    Example record = new Example(); 

    using (WebClient wc = new WebClient()) { 
     wc.Headers.Add("Accept", "application/json"); 

     try { 
      DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(Example)); 
      using (Stream s = await wc.OpenReadTaskAsync("https://example.com/sample.json")) { 
       record = ser.ReadObject(s) as Example; 
      } 
     } catch (SerializationException se) { 
      Debug.WriteLine(se.Message); 
     } catch (WebException we) { 
      Debug.WriteLine(we.Message); 
     } catch (Exception e) { 
      Debug.WriteLine(e.Message); 
     } 
    } 
    return record; 
} 

Однако, у меня есть другой сценарий, где данные я работаю с зашифрован, поэтому мне нужно декодировать base64, а затем расшифровать результат, чтобы получить json-данные.

Для простоты предположим, что следующее является строка, полученная от сервера (base64 закодированного только):

ew0KICAidG9tIjogIjEyMyINCn0= 

который декодирует с (хранится в foo)

string foo = Convert.FromBase64String("ew0KICAidG9tIjogIjEyMyINCn0="); 

Как I pass foo до .ReadObject() as .ReadObject() только принимает Stream

ответ

1

записать его обратно в поток и передать поток в ReadObject. Вы можете использовать MemoryStream, как описано here.

Ниже приведен пример как метод анонимного типа:

/// <summary> 
/// Read json from string into class with DataContract properties 
/// </summary> 
/// <typeparam name="T">DataContract class</typeparam> 
/// <param name="json">JSON as a string</param> 
/// <param name="encoding">Text encoding format (example Encoding.UTF8)</param> 
/// <param name="settings">DataContract settings (can be used to set datetime format, etc)</param> 
/// <returns>DataContract class populated with serialized json data</returns> 
public static T FromString<T>(string json, Encoding encoding, DataContractJsonSerializerSettings settings) where T : class { 
    T result = null; 
    try { 
     DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T), settings); 
     using (Stream s = new MemoryStream((encoding ?? Encoding.UTF8).GetBytes(json ?? ""))) { 
      result = ser.ReadObject(s) as T; 
     } 
    } catch (SerializationException se) { 
     Debug.WriteLine(se.Message); 
    } catch (Exception e) { 
     Debug.WriteLine(e.Message); 
    } 
    return result; 
} 
+0

Это хорошо. Вы проверите это позже. Если код, который там работает, изменит ваше решение и отметит как принятый. Тем временем, у меня есть приоритет, поскольку это похоже на то, что я искал. :) –

+0

Добавлен пример в виде метода анонимного типа для повторного использования. Извините за задержку в обновлении с примером. –

1

Попробуйте yhis:

using (Stream s = await wc.OpenReadTaskAsync("https://example.com/sample.json")) 
{ 
    string str = Encoding.UTF8.GetString(s.GetBuffer(),0 , s.GetBuffer().Length) 
    string foo = Convert.FromBase64String(str); 
} 
+0

'Foo' должен быть преобразован в' 'Stream' как .ReadObject()' принимает только объекты типа 'Stream'. –

+0

@KraangPrime - После получения foo обратитесь к * zmbq * для создания потока из foo. – Graffito