繁体   English   中英

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

[英]How to create C# classes to deserialize a JSON string which starts and ends with square brackets

我从 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)的类型,如List<T>可以从 JSON 数组反序列化

试试这个:

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

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

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

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

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

[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类; 这里不需要。

请确保您的 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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM