C# 从内存中的字符串值反序列化为DataContract

C# 从内存中的字符串值反序列化为DataContract,c#,json,string,stream,datacontractserializer,C#,Json,String,Stream,Datacontractserializer,我有以下代码(可以工作)来反序列化从web调用接收的原始json: public static async Task<Example> GetExample() { Example record = new Example(); using ( WebClient wc = new WebClient() ) { wc.Headers.Add( "Accept", "application/json" ); try {

我有以下代码(可以工作)来反序列化从web调用接收的原始json:

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;
}
使用(存储在
foo
中)进行解码

如何将
foo
传递给
.ReadObject()
作为
.ReadObject()
仅接受
请尝试以下操作:

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);
}
试试看他:

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);
}

将其写回到流中,并将流传递给
ReadObject
。如前所述,您可以使用
MemoryStream

以下是匿名类型方法的示例:

/// <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;
}
//
///将json从字符串读入具有DataContract属性的类
/// 
///DataContract类
///作为字符串的JSON
///文本编码格式(示例encoding.UTF8)
///DataContract设置(可用于设置日期时间格式等)
///用序列化json数据填充的DataContract类
公共静态T FromString(字符串json、编码、DataContractJsonSerializerSettings设置),其中T:class{
T结果=null;
试一试{
DataContractJsonSerializer ser=新的DataContractJsonSerializer(类型(T),设置);
使用(streams=newmemoryStream((encoding??encoding.UTF8).GetBytes(json??)){
结果=序列读取对象作为T;
}
}捕获(序列化异常){
Debug.WriteLine(se.Message);
}捕获(例外e){
Debug.WriteLine(即消息);
}
返回结果;
}

将其写回到流中,并将流传递给
ReadObject
。如前所述,您可以使用
MemoryStream

以下是匿名类型方法的示例:

/// <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;
}
//
///将json从字符串读入具有DataContract属性的类
/// 
///DataContract类
///作为字符串的JSON
///文本编码格式(示例encoding.UTF8)
///DataContract设置(可用于设置日期时间格式等)
///用序列化json数据填充的DataContract类
公共静态T FromString(字符串json、编码、DataContractJsonSerializerSettings设置),其中T:class{
T结果=null;
试一试{
DataContractJsonSerializer ser=新的DataContractJsonSerializer(类型(T),设置);
使用(streams=newmemoryStream((encoding??encoding.UTF8).GetBytes(json??)){
结果=序列读取对象作为T;
}
}捕获(序列化异常){
Debug.WriteLine(se.Message);
}捕获(例外e){
Debug.WriteLine(即消息);
}
返回结果;
}

foo
需要转换为
作为
.ReadObject()
只接受
流类型的对象
@krangprime-一旦得到foo,请参考zmbq答案从foo生成流。
foo
需要转换为
作为
.ReadObject()
只接受类型为
Stream
@krangprime的对象-一旦得到foo,请参考zmbq-answer从foo生成流。这很好。稍后将对此进行测试。如果该代码适用,则将修改您的解决方案并标记为已接受。与此同时,我已经投了更高的票,因为它看起来就像我一直在寻找的一样以匿名类型方法的形式添加了一个示例以供重用。很抱歉,更新过程中出现了延迟,请举例说明。这很好。稍后将对此进行测试。如果该代码适用,则将修改您的解决方案并标记为已接受。与此同时,我已经投了更高的票,因为它看起来就像我一直在寻找的一样以匿名类型方法的形式添加了一个示例以供重用。很抱歉,更新过程中出现延迟,请举例说明。