C# 反序列化包含另一个数组的字符串数组
好的,我正在创建一个REST-API,为了给我的数据库种子,我使用了大量JSON文件形式的现有数据。在反序列化其中一个字段时,我遇到了一个问题 因此,JSON如下所示:C# 反序列化包含另一个数组的字符串数组,c#,arrays,json,json.net,C#,Arrays,Json,Json.net,好的,我正在创建一个REST-API,为了给我的数据库种子,我使用了大量JSON文件形式的现有数据。在反序列化其中一个字段时,我遇到了一个问题 因此,JSON如下所示: { "name" : "Magic 2013", "booster" : [ "land", "marketing", "common", "common", "common", "common", "common", "common", "com
{
"name" : "Magic 2013",
"booster" : [
"land",
"marketing",
"common",
"common",
"common",
"common",
"common",
"common",
"common",
"common",
"common",
"common",
"uncommon",
"uncommon",
"uncommon",
[
"rare",
"mythic rare"
]
]
}
当你看这个的时候,你可能也能发现问题所在。有一个叫做“助推器”的字段,它是一个字符串数组。。但最后一个元素不是字符串。这是另一个数组。因此,尝试将其反序列化为字符串[]-字段失败
我必须使用这种格式-我没有办法改变它,所以我必须想出一个聪明的方法来解决这个问题。这就是我需要帮助的地方
使用JSON.NET是否有任何方法可以将其反序列化?通过某种方式,我可以进行某种手动映射,即每当我到达内部数组时,我都要执行一些自定义代码
如果有任何帮助,我将不胜感激
谢谢 您可以将
booster
属性定义为:
这不会强制执行数组的特定数据类型。然后,您可以循环该数组的每个元素(将是a),测试它是字符串值还是另一个JArray
,并相应地采取行动:
foreach (JToken token in model.Booster)
{
var array = token as JArray();
if (array != null)
{
// The element is an array, so you can process its subelements here
}
else
{
// It's probably a string element
string value = token.ToObject<string>();
}
}
foreach(model.Booster中的JToken令牌)
{
var array=标记为JArray();
if(数组!=null)
{
//元素是数组,因此您可以在此处处理其子元素
}
其他的
{
//它可能是一个字符串元素
字符串值=token.ToObject();
}
}
如果它始终是最后一个包含数组而不是字符串的元素,则可以使用反序列化器
public class RootObject
{
public string name { get; set; }
public List<object> booster { get; set; }
}
这是假设它始终是数组的最后一个元素,所以这对我来说是有效的:
class WhateverMyThingIsNamed
{
public string Name { get; set; }
public object[] Booster { get; set; }
public IEnumerable<string> GetBooster()
{
foreach (var o in Booster)
{
if (o is string)
{
yield return (string) o;
}
else if (o is JArray)
{
foreach (var element in (JArray) o)
{
yield return element.Value<string>();
}
}
else
{
throw new InvalidOperationException("Unexpected element");
}
}
}
}
...
var json = File.ReadAllText("json1.json");
var data = new JsonSerializer().Deserialize<WhateverMyThingIsNamed>(new JsonTextReader(new StringReader(json)));
var boosterList = data.GetBooster().ToList();
class WhateverMyThingIsNamed
{
公共字符串名称{get;set;}
公共对象[]{get;set;}
公共IEnumerable GetBooster()
{
foreach(增压器中的var o)
{
if(o是字符串)
{
收益率返回(字符串)o;
}
else if(o是JArray)
{
foreach(JArray)o中的var元素)
{
yield返回元素.Value();
}
}
其他的
{
抛出新的InvalidOperationException(“意外元素”);
}
}
}
}
...
var json=File.ReadAllText(“json1.json”);
var data=new-JsonSerializer()。反序列化(new-JsonTextReader(new-StringReader(json));
var boosterList=data.GetBooster().ToList();
这正是我想要的。我不知道JArray可以这样使用。但这可能就是它的真正用途。谢谢!我会这样做:)祝你今天愉快。
var oddItem = booster[booster.Count -1];
class WhateverMyThingIsNamed
{
public string Name { get; set; }
public object[] Booster { get; set; }
public IEnumerable<string> GetBooster()
{
foreach (var o in Booster)
{
if (o is string)
{
yield return (string) o;
}
else if (o is JArray)
{
foreach (var element in (JArray) o)
{
yield return element.Value<string>();
}
}
else
{
throw new InvalidOperationException("Unexpected element");
}
}
}
}
...
var json = File.ReadAllText("json1.json");
var data = new JsonSerializer().Deserialize<WhateverMyThingIsNamed>(new JsonTextReader(new StringReader(json)));
var boosterList = data.GetBooster().ToList();