Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 反序列化包含另一个数组的字符串数组_C#_Arrays_Json_Json.net - Fatal编程技术网

C# 反序列化包含另一个数组的字符串数组

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

好的,我正在创建一个REST-API,为了给我的数据库种子,我使用了大量JSON文件形式的现有数据。在反序列化其中一个字段时,我遇到了一个问题

因此,JSON如下所示:

{
  "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();