c# - 创建自定义 NewtonSoft JSON 转换器

标签 c# json json.net

我有以下 JSon,我正在使用 NewtonSoft JSon 进行解析:

{
  "page" : 0,
  "listings" : [ 
    {
      "data" : { "name" : "Name 1", "id" : "id1" },
      "media" : {
        "images" : [ 
          { "title" : "image1", "url" : "http://www.d.com/image1" }, 
          { "title" : "image2", "url" : "http://www.d.com/image3" }, 
        ]
      }
    },
    {
      "data" : { "name" : "Name 2", "id" : "id2" },
      "media" : {
        "images" : [ 
          { "title" : "image3", "url" : "http://www.d.com/image3" }, 
          { "title" : "image4", "url" : "http://www.d.com/image4" }, 
        ]
      }
    },

 }

C#对象如下:

public class Result {

  [JsonProperty("page")]
  public Int32 Page { get; set; }

  [JsonProperty("listings")]
  public List<Listing> Listings { get; set; }

} // PropertyResult

public class Listing {

  [JsonProperty("data")]
  public ListingData Data { get; set; }    

  [JsonProperty("media")]
  public ListingMedia Media{ get; set; }    

}

public class ListingData {

  [JsonProperty("id")]
  public Int32 Id { get; set; }

  [JsonProperty("name")]
  public String Name { get; set; }

}

public class ListingMedia {

  [JsonProperty("images")]
  public IList<ListingMediaImage> Images { get; set; }

}

public class ListingMediaImage {

  [JsonProperty("title")]
  public String Title { get; set; }

  [JsonProperty("url")]
  public String Url { get; set; }

}

我能够解析 ResultPage 但不能解析列表。

然后我尝试了一个转换器:

public class ResultConverter : JsonConverter {

  public override bool CanConvert(Type objectType) {
    return (objectType == typeof(Result));
  }

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

    JObject jo = JObject.Load(reader);
    Result result = jo.ToObject<Result>();
    result.Listings.Data = jo.SelectToken("listings.data").ToObject<ResultData>();
    result.Listings.Images = jo.SelectToken("listings.media").ToObject<ResultMedia>();
    return result;


  }

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

}

这是行不通的。 有谁知道我应该如何创建转换器?

最佳答案

您的 JSON 标记与您的 .NET 类不匹配,因此反序列化失败,原因如下:

  1. 您希望 ListingData.Id 是一个整数,但您的 JSON 使用字母数字 id
  2. 你还没有关闭你的listings数组
  3. 您可能需要去掉多余的尾随逗号

修复 listings[n].data.id 值或将 ListingData.Id 的数据类型更改为 String,然后清理排除 JSON 语法错误,一切就绪。

你真的不需要自定义转换器;您的标记非常标准。以下是可以反序列化为当前 .NET 类的有效 JSON 标记:

string json = @"{
    ""page"" : 0,
    ""listings"" : [{
        ""data"" : { ""name"" : ""Name 1"", ""id"" : ""1"" },
        ""media"" : {
            ""images"" : [ 
                { ""title"" : ""image1"", ""url"" : ""http://www.d.com/image1"" }, 
                { ""title"" : ""image2"", ""url"" : ""http://www.d.com/image3"" } 
            ]
        }
    },
    {
        ""data"" : { ""name"" : ""Name 2"", ""id"" : ""2"" },
        ""media"" : {
            ""images"" : [ 
                { ""title"" : ""image3"", ""url"" : ""http://www.d.com/image3"" }, 
                { ""title"" : ""image4"", ""url"" : ""http://www.d.com/image4"" } 
            ]
        }
    }]
}";

var result = JsonConvert.DeserializeObject<Result>(json);

您的 IDE/调试器提供了非常有用的错误信息。在这种情况下,我通过检查 Newtonsoft 库抛出的错误了解了修复 JSON 所需的一切。请确保正确调试您的代码,这些问题通常会自行解决。

关于c# - 创建自定义 NewtonSoft JSON 转换器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30986760/

相关文章:

objective-c - iOS JSON 身份验证 token 请求显示缺少参数

c# - 使用 Newtonsoft.Json 使用两个不同的 JsonConverter 序列化 C# 对象

c# - JSON.net 直接从 oledbconnection 序列化

c# - 无法使用站点间连接从 Azure VM 连接 Azure SQL

c# - 如何使用绑定(bind)嵌套 View ?

C# Linq : Combine multiple . Where() with an *OR* 子句

c# - 更新到 Automapper v5 时出现 .NullSubstitute 错误

c# - 如何删除json中的附加键

c# - 附加到 Windows 应用程序中的 json 文件

php - 使用 PHP 从 MySQL DB 检索图像并保存到服务器目录