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

时间:2019-04-25 06:53:46

标签: c# json json.net

我正在从API接收到JSON字符串,并想将其反序列化为C#对象,但无法正确获取类。

我尝试使用http://json2csharp.com/创建类,但是无法解析JSON,但是https://jsonlint.com/表示JSON有效。

我也尝试过运行JsonClassGeneratorLib,但这表示

  

无法将类型为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; }
}

我总是会收到错误

  

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

3 个答案:

答案 0 :(得分:2)

尝试一下:

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

说明:如果JSON是数组,则C#RootObject必须要么从List / IEnumberable本身派生,要么将其反序列化为类型的List / Array。

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

答案 1 :(得分:1)

您的JSON是包含字符串和对象的异构数组。在没有一点帮助的情况下,这不会干净地反序列化为强类型的类结构。一种可能的解决方案是使用自定义JsonConverter,如下所示:

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();
    }
}

然后使用如下所示的Result属性将转换器绑定到您的[JsonConverter]类:

[JsonConverter(typeof(ResultConverter))]
public class Result
{
    public string String { get; set; }
    public CodeMsg cm { get; set; }
}

最后,像这样将JSON反序列化为Result类:

var result = JsonConvert.DeserializeObject<Result>(Json);

正在运行的演示:https://dotnetfiddle.net/RLpm5W

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

答案 2 :(得分:0)

只需确保您的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()

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

dynamic obj= new JsonConver.DeserializeObject<List<JsonHolder>>(StrJson);