【问题标题】:JSON.NET Deserialize Error converting to IList<string>JSON.NET 反序列化错误转换为 IList<string>
【发布时间】:2016-03-01 14:00:35
【问题描述】:

我有一个来自 Tika Rest Service 的 json,其中包含消息收件人列表。该列表如下所示:

"Message-Recipient-Address": [
  "Mail1.Mail@mail.mail",
  "Mail2.Mail@mail.mail"]

在我的模型中,我有

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

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

将值“Mail1.Mail@mail.mail”转换为类型“System.Collections.Generic.IList`1[System.String]”时出错。路径“[0].Message-Recipient-Address”,第 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;
    }
}

任何线索我做错了什么,或者为什么这不起作用?先感谢您, 斯蒂芬

【问题讨论】:

  • 你用什么反序列化的?可以发一下代码吗?
  • 您的 Json 字符串不完整,因此请说明(仅缺少 {}?)。同样通过您的编辑,您仍然没有向我们展示您在哪里调用反序列化。
  • 显示整个 JSON 请求。
  • 您尝试反序列化 json 的代码在哪里?
  • 您可以使用 response.Content.Split(new char[] { ':', ',', '[', ']' }) 而不是 JSONSerializer。

标签: c# json json.net json-deserialization


【解决方案1】:

通过编写自定义 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 "Mail1.Mail@mail.mail" to type 
    

    据我所知,您试图将单个电子邮件地址反序列化为电子邮件地址列表,这显然失败了。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-16
      • 2011-12-09
      • 1970-01-01
      • 2016-09-25
      相关资源
      最近更新 更多