2016-03-01 45 views
0

我有一个来自Tika Rest Service的json和一个消息收件人列表。名单如下:JSON.NET反序列化错误转换为IList <string>

"Message-Recipient-Address": [ 
    "[email protected]", 
    "[email protected]"] 

在我的模型,我有

[JsonProperty("Message-Recipient-Address")] 
public IList<string> MailRecipientAddress { get; set; } 

当尝试反序列化,我收到以下错误消息。

将值“[email protected]”转换为键入'System.Collections.Generic.IList`1 [System.String]'时出错。路径 '[0] .Message-接收者地址',1号线,位置319

这是我解串器的代码(Restsharp)

public class TikaDeserializer : IDeserializer 
{ 
    private Newtonsoft.Json.JsonSerializer serializer; 

    public TikaDeserializer(Newtonsoft.Json.JsonSerializer serializer) 
    { 
     this.serializer = serializer; 
    } 

    public T Deserialize<T>(RestSharp.IRestResponse response) 
    { 
     var content = response.Content; 

     using(var stringReader = new StringReader(content)) 
     { 
      using(var jsonTextReader = new JsonTextReader(stringReader)) 
      { 

       return serializer.Deserialize<T>(jsonTextReader); 
      } 
     } 
    } 

    public string DateFormat { get; set; } 

    public string Namespace { get; set; } 

    public string RootElement { get; set; } 

    public static TikaDeserializer Default 
    { 
     get 
     { 
      return new TikaDeserializer(new Newtonsoft.Json.JsonSerializer() 
      { 
       NullValueHandling = NullValueHandling.Ignore, 
      }); 
     } 
    } 
} 

而且这里的主程序代码

class Program 
{ 
    static void Main(string[] args) 
    { 
     var request = new RestRequest("rmeta", Method.PUT); 
     request.AddHeader("Accept", "application/json"); 
     request.AddParameter("application/octet-stream", File.ReadAllBytes(@"D:\Wienchol.msg"),ParameterType.RequestBody); 
     var response = Execute<List<ParsedDocument>>(request); 

    } 



    public static T Execute<T>(RestRequest request) where T : new() 
    { 
     var client = Client(@"http://localhost:9998"); 
     client.AddHandler("application/json", TikaDeserializer.Default); 
     client.AddHandler("text/json", TikaDeserializer.Default); 
     client.AddHandler("text/x-json", TikaDeserializer.Default); 
     client.AddHandler("text/javascript", TikaDeserializer.Default); 
     client.AddHandler("*+json", TikaDeserializer.Default); 

     var response = client.Execute<T>(request); 

     if(response.ErrorException != null) 
     { 
      throw new SystemException(response.ErrorMessage); 
     } 

     return response.Data; 
    } 
} 

任何线索我做错了什么,或为什么这不工作?谢谢你在前进, 斯特凡

+0

你是怎么使用反序列化?你可以发布代码吗? –

+0

你的Json字符串不完整,请显示(缺少''''和'}'?)。在编辑的同时,您仍然没有向我们展示您称之为反序列化的位置。 – crashmstr

+0

显示整个JSON请求。 – Wapac

回答

0

发现我的问题的解决方案通过编写自定义的Json转换器:

public class JsonStringListConverter: JsonConverter 
{ 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 

     if(reader.TokenType == JsonToken.Null) 
     { 
      return null; 
     } 

     List<string> items = new List<string>(); 

     if(reader.TokenType == JsonToken.String) 
     { 

      string value = reader.Value.ToString(); 
      items.Add(value); 
     } 

     if(reader.TokenType == JsonToken.StartArray) 
     { 

      reader.Read(); 
      do 
      { 
       string value = reader.Value.ToString(); 
       items.Add(value); 
       reader.Read(); 
      } while (reader.TokenType != JsonToken.EndArray); 
     } 

     return (items.Count = 0) ? null : items; 
    } 



    public override bool CanConvert(Type objectType) 
    { 
     return (objectType == typeof(IList<string>)); 
    } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    } 
} 

而且在我的模型

[JsonProperty("Message-Recipient-Address")] 
[JsonConverter(typeof(JsonStringListConverter))] 
public IList<string> MailRecipientAddress { get; set; } 
-2
Error converting value "[email protected]" to type 

从我所看到的,你想反序列化一个电子邮件地址作为电子邮件地址的列表,这显然会失败。

请发布您用于反序列化输入的任何附加代码。

编辑:我看到你已经发布了一些代码,但它仍然没有向我们展示反序列化过程。