如何创建C#类来反序列化以方括号开头和结尾的JSON字符串

如何创建C#类来反序列化以方括号开头和结尾的JSON字符串,c#,json,json.net,C#,Json,Json.net,我从API收到一个JSON字符串,希望将其反序列化为C#对象,但无法获得正确的类 我曾尝试使用创建类,但它无法解析JSON,但表示JSON是有效的 我也试过跑步,但这说明 无法将Newtonsoft.Json.Linq.JValue类型的对象强制转换为Newtonsoft.Json.Linq.JObject 这似乎是一个问题,因为JSON包含在[]方括号中。我相信这是有效的,但它使它成为一个数组。我想我需要一个数组 string Json = @"[""error"",{""code"":2,"

我从API收到一个JSON字符串,希望将其反序列化为C#对象,但无法获得正确的类

我曾尝试使用创建类,但它无法解析JSON,但表示JSON是有效的

我也试过跑步,但这说明

无法将Newtonsoft.Json.Linq.JValue类型的对象强制转换为Newtonsoft.Json.Linq.JObject

这似乎是一个问题,因为JSON包含在
[]
方括号中。我相信这是有效的,但它使它成为一个数组。我想我需要一个数组

string Json = @"[""error"",{""code"":2,""msg"":""This API Key is invalid""}]";

var obj = JsonConvert.DeserializeObject<RootObject>(Json);


public class CodeMsg
{
    [JsonProperty("code")]
    public long Code { get; set; }

    [JsonProperty("msg")]
    public string Msg { get; set; }
}

public class Result
{
    [JsonProperty("error")]
    public string String { get; set; }
    public CodeMsg cm { get; set; }
}

public class RootObject
{
    public Result Result { get; set; }
}
string Json=@“[”错误“,{”“代码”“:2”,“消息”“:”“此API密钥无效”“}]”;
var obj=JsonConvert.DeserializeObject(Json);
公共类代码msg
{
[JsonProperty(“代码”)]
公共长代码{get;set;}
[JsonProperty(“msg”)]
公共字符串Msg{get;set;}
}
公开课成绩
{
[JsonProperty(“错误”)]
公共字符串{get;set;}
公共代码msg cm{get;set;}
}
公共类根对象
{
公共结果结果{get;set;}
}
我总是犯错误

无法将当前JSON数组(例如[1,2,3])反序列化为类型“ConsoleApp1.RootObject”,因为该类型需要一个JSON对象(例如{“name”:“value”})才能正确反序列化。 要修复此错误,请将JSON更改为JSON对象(例如{“name”:“value”}),或将反序列化类型更改为数组或实现集合接口(例如ICollection,IList)的类型,如可以从JSON数组反序列化的
列表

试试这个:

var obj = JsonConvert.DeserializeObject<List<Result>>(Json);
var obj=JsonConvert.DeserializeObject(Json);
说明:如果JSON是一个数组,那么C#RootObject必须从List/IEnumerable本身派生,或者将其反序列化为该类型的List/Array


您可以转储
RootObject
类。如果要使用
RootObject
类型,请使其派生自列表。但这不值得这么麻烦。

只要确保json字符串必须与JsonHolder类具有相同的属性即可

public class JsonHolder
{
    public string Id {get;set;}
    public string Name {get;set;}
    public string Gender {get;set;}
}

var jsonHolderList = new JsonConvert.DeserializeObject<List<JsonHolder>>(jsonString);
var jsonHolder = jsonHolderList.Single()
dynamic obj= new JsonConver.DeserializeObject<List<JsonHolder>>(StrJson);
公共类JsonHolder
{
公共字符串Id{get;set;}
公共字符串名称{get;set;}
公共字符串{get;set;}
}
var jsonHolderList=新的JsonConvert.DeserializeObject(jsonString);
var jsonHolder=jsonHolderList.Single()

您还可以将json字符串转换为c#对象作为动态对象。只需确保json字符串必须具有与JsonHolder类相同的属性

public class JsonHolder
{
    public string Id {get;set;}
    public string Name {get;set;}
    public string Gender {get;set;}
}

var jsonHolderList = new JsonConvert.DeserializeObject<List<JsonHolder>>(jsonString);
var jsonHolder = jsonHolderList.Single()
dynamic obj= new JsonConver.DeserializeObject<List<JsonHolder>>(StrJson);
dynamic obj=新的JsonConver.DeserializeObject(StrJson);

您的JSON是一个包含字符串和对象的异构数组。如果没有一点帮助,这将不会干净地反序列化到强类型类结构中。一种可能的解决方案是使用如下自定义设置:

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)
    {
        JArray array = JArray.Load(reader);
        Result result = new Result
        {
            String = array[0].Value<string>(),
            cm = array[1].ToObject<CodeMsg>(serializer)
        };
        return result;
    }

    public override bool CanWrite
    {
        get { return false; }
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}
[JsonConverter(typeof(ResultConverter))]
public class Result
{
    public string String { get; set; }
    public CodeMsg cm { get; set; }
}
var result = JsonConvert.DeserializeObject<Result>(Json);
最后,将JSON反序列化到
Result
类中,如下所示:

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)
    {
        JArray array = JArray.Load(reader);
        Result result = new Result
        {
            String = array[0].Value<string>(),
            cm = array[1].ToObject<CodeMsg>(serializer)
        };
        return result;
    }

    public override bool CanWrite
    {
        get { return false; }
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}
[JsonConverter(typeof(ResultConverter))]
public class Result
{
    public string String { get; set; }
    public CodeMsg cm { get; set; }
}
var result = JsonConvert.DeserializeObject<Result>(Json);
var result=JsonConvert.DeserializeObject(Json);
工作演示:


注意:您可以删除
RootObject
类;这里不需要它。

最好是引用错误消息:
将反序列化类型更改为数组或实现集合接口的类型
只需确保,您的json字符串必须具有与JsonHolder类相同的属性。只有代码的答案被认为是低质量的:请确保提供代码的功能以及如何解决问题的解释。我已将您的评论移到正文中-请删除您的评论(我无法)。然后,将值“Error”转换为类型“ConsoleApp1.Result”时,会出现此
错误。路径“[0]”,第1行,位置8。
能否将
结果
类型括在括号中,以便将其解释为连贯的对象<代码>@“[{”“错误”“{”“代码”“:2”“消息”“:”“此API密钥无效”“}}]”我刚刚意识到你表达的是一个or类型(我想你可以称之为有区别的联合):要么是字符串“error”,要么是对象“CodeMsg”。你不能用C来表达这一点。因此,我建议使用对象语法。