JSON.net - 字段是字符串或列表<串GT; [英] JSON.net - field is either string or List<string>

查看:113
本文介绍了JSON.net - 字段是字符串或列表<串GT;的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我所在的 JSON REST返回的情况 -service返回短片对象的列表,所有一吨的信息specced出来。一对夫妇根据信息在 REST -service结果变化领域的使用。

I have a situation where the JSON returned from a REST-service returns a list of Movie-objects, all specced out with a ton of information. A couple of fields in that REST-service result changes depending on the information available.

一个例子:一个电影总有一些屏幕截图(图片),演员和导演。视电影问题,可能有一个或多个图像,一个或多个行动者和一个或多个导演。 JSON样本为一对夫妇的案件:

An example: A Movie always has some screen captures (images), actors and directors. Depending on the movie in question, there might be one or more images, one or more actors and one or more directors. Sample JSON for a couple of cases:

{
    "title": "Movie title",
    "images": [
        "http://www.url.com/img_0.jpg",
        "http://www.url.com/img_1.jpg",
        "http://www.url.com/img_2.jpg",
        "http://www.url.com/img_3.jpg",
        "http://www.url.com/img_4.jpg"
    ],
    "actors": [
        "Steven Berkoff",
        "Nikolaj Coster-Waldau",
        "Julie Cox"
    ],
    "directors": "Simon Aeby"
},
{
    "title": "Another movie",
    "images": "http://www.url.com/img_1.jpg",
    "actors": "actor 1"
    "directors": [
        "Justin Bieber",
        "Justin Timberlake"
    ]
}

现在的问题是,使用JSON.net,我怎么可以创建一个转换器,这个问题涉及?我一直在网上淘的,但仍然没有找到一个解决方案。

The question is, using JSON.net, how can I create a converter that deals with this problem? I've been scouring the internet, but still haven't found a solution.

这是同一个问题的另一个旋转:如果一个字段是一个字符串列表或一个简单的字符串,我怎么做JSON.NET创建一个列表任何一种方式(如果只是一个简单的字符串,创建一个列表与一个成员)

Another spin on the same question: If a field is either a List of strings or a simple string, how do I make JSON.NET create a List either way (and if just a simple string, create a list with one member)

编辑:这REST的服务是在我的掌握

This REST-service is out of my control

推荐答案

<击>好吧,我这样做是为了好玩,但不认为这是有益的或者最好的方式,反正...

Ok, I did it for fun, but don't think is useful or the best way, anyway...

的声明动态属性作为对象,然后创建方法来获取属性类似ImagesAsList或ImagesAsString。我与扩展方法做了.....

Declaring the "dynamic" attributes as object and then create methods to obtain the properties as something like ImagesAsList or ImagesAsString. I did it with Extension Methods.....

var movies = JsonConvert.DeserializeObject<List<Movie>>(str);

class Movie
{

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

    [JsonProperty("images")]
    public object Images { get; set; }

    [JsonProperty("actors")]
    public object Actor { get; set; }

    [JsonProperty("directors")]
    public object Directors { get; set; }
}

扩展方法

static class MovieExtension
{
    public static List<string> ImagesAsList(this Movie m)
    {
        var jArray = (m.Images as JArray);
        if (jArray == null) return null;

        return jArray.Select(x => x.ToString()).ToList();
    }

    public static string ImagesAsString(this Movie m)
    {
        return m.Images as string;
    }

}

修改

阅读@yamen的意见后,我做了一些更改,如:

After reading @yamen comments I did some changes like:

var settings = new JsonSerializerSettings();
settings.Converters.Add(new MoviesConverter());

var movies = JsonConvert.DeserializeObject<List<Movie>>(str, settings);

class Movie
{

    [JsonProperty("title")]
    public List<string> Title { get; set; }

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

    [JsonProperty("actors")]
    public List<string> Actor { get; set; }

    [JsonProperty("directors")]
    public List<string> Directors { get; set; }
}

转换

class MoviesConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return (objectType == typeof(string)) || (objectType == typeof(List<string>)) ;
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.StartArray)
        {
            var l = new List<string>();
            reader.Read();
            while (reader.TokenType != JsonToken.EndArray)
            {
                l.Add(reader.Value as string);

                reader.Read();
            }
            return l;
        }
        else
        {
            return new List<string> { reader.Value as string };
        }
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        //ToDo here we can decide to write the json as 
        //if only has one attribute output as string if it has more output as list
    }
}

这篇关于JSON.net - 字段是字符串或列表&LT;串GT;的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆