gpt4 book ai didi

c# - JSON.net - 字段是字符串或 List

转载 作者:IT王子 更新时间:2023-10-29 04:50:06 25 4
gpt4 key购买 nike

我遇到这样一种情况,从 REST 服务返回的 JSON 返回电影对象列表,所有对象都包含大量信息。该 REST 服务结果中的几个字段会根据可用信息发生变化。

一个例子:电影总是有一些屏幕截图(图像)、 Actor 和导演。根据所讨论的电影,可能有一张或多张图片、一位或多位 Actor 以及一位或多位导演。几个案例的示例 JSON:

{
"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,我如何创建一个转换器来处理这个问题?我一直在网上搜索,但仍未找到解决方案。

关于同一个问题的另一个旋转:如果一个字段是一个字符串列表或一个简单的字符串,我如何让 JSON.NET 创建一个列表(如果只是一个简单的字符串,创建一个包含一个成员的列表)

编辑:这个 REST 服务不在我的控制范围内

最佳答案

好吧,我这样做是为了好玩,但我认为这不是有用的或最好的方法,无论如何......

将“动态”属性声明为对象,然后创建方法以获取属性,如 ImagesAsList 或 ImagesAsString。我用扩展方法做到了......

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 的评论后,我做了一些更改,例如:

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

关于c# - JSON.net - 字段是字符串或 List<string>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10121804/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com