Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.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# JsonConvert.DeserializeObject<;列表<;对象>&燃气轮机;如果ApiResponse小于2个JSON对象,则获取异常_C#_Json - Fatal编程技术网

C# JsonConvert.DeserializeObject<;列表<;对象>&燃气轮机;如果ApiResponse小于2个JSON对象,则获取异常

C# JsonConvert.DeserializeObject<;列表<;对象>&燃气轮机;如果ApiResponse小于2个JSON对象,则获取异常,c#,json,C#,Json,我正在尝试将JSON字符串转换为对象 我的模型课: public class ResponseData<obj> where obj : class { public string message { get; set; } public Boolean isSuccess { get; set; } public obj data{ get; set; } } public class Registration { public int id {

我正在尝试将JSON字符串转换为对象

我的模型课:

public class ResponseData<obj> where obj : class
{
    public string message { get; set; }
    public Boolean isSuccess { get; set; }
    public  obj data{ get; set; }
}

public class Registration
{
    public int id { get; set; }
    public int eventId { get; set; }
    public string eventTitle { get; set; }
    public string startDate { get; set; }
    public string status { get; set; }
}
我的JsonConvert代码

ResponseData<IList<Registration>> responseListRegistration = JsonConvert.DeserializeObject<ResponseData<IList<Registration>>>(apiResponse);

感谢阅读

要在一个类模型中反序列化两个不同的json结构,需要使用自定义的
JsonConverter
JsonReader
允许您读取第一个令牌。如果是
[
,则需要反序列化为列表。如果是
{
,则为对象

void Main()
{
    var json = "{ \"message\": \"Success\", \"isSuccess\": true, \"data\": [ { \"id\": 6, \"eventId\": 1, \"eventTitle\": \"Test Event\", \"startDate\": \"2020-10-10T00:00:00\", \"status\": \"Pending\" }, { \"id\": 1, \"eventId\": 4, \"eventTitle\": \"dung test\", \"startDate\": \"2020-10-15T00:00:00\", \"status\": \"Denied\" } ]}";
    var json2 = "{ \"message\": \"Success\", \"isSuccess\": true, \"data\": { \"id\": 6, \"eventId\": 1, \"eventTitle\": \"Test Event\", \"startDate\": \"2020-10-10T00:00:00\", \"status\": \"Pending\" }}";

    var multiItems = JsonConvert.DeserializeObject<ResponseData<IList<Registration>>>(json);
    var singleItem = JsonConvert.DeserializeObject<ResponseData<IList<Registration>>>(json2);
}

public class ResponseData<T> where T : class
{
    public string message { get; set; }
    public Boolean isSuccess { get; set; }

    [JsonConverterAttribute(typeof(ItemOrListConverter))]
    public T data { get; set; }
}
public class Registration
{
    public int id { get; set; }
    public int eventId { get; set; }
    public string eventTitle { get; set; }
    public string startDate { get; set; }
    public string status { get; set; }
}

public class ItemOrListConverter : Newtonsoft.Json.JsonConverter
{
    public override object? ReadJson(JsonReader reader, Type objectType, object? existingValue, JsonSerializer serializer)
    {
        var itemType = objectType.GetGenericArguments()[0];
        var listType = typeof(List<>).MakeGenericType(itemType);

        var result = Activator.CreateInstance(listType) as IList;

        if (reader.TokenType == JsonToken.StartObject)
        {
            var singleObject = serializer.Deserialize(reader, itemType);
            result.Add(singleObject);
        }
        else if (reader.TokenType == JsonToken.StartArray)
        {
            while (reader.Read())
            {
                if (reader.TokenType == JsonToken.EndArray)
                    break;

                var singleObject = serializer.Deserialize(reader, itemType);
                result.Add(singleObject);
            }
        }

        return result;
    }

    public override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override bool CanConvert(Type objectType)
    {
        throw new NotImplementedException();
    }
}
void Main()
{
var json=“{\'message\”:\“Success\”,\“issucess\”:true,\“data\”:[{\'id\”:6,\“eventId\”:1,\“eventTitle\”:“Test Event\”,\“startDate\”:“2020-10-10T00:00:00\,“status\”:“Pending\”,“{\'id\”:1,\“eventId\”:4,\“eventTitle\:“dung Test\”,“startDate\”,“startDate\”:“2020-10-10-10T00:00\”,“status\”,“status\”,\”,“status\”:“Denied\”,\”;
var json2=“{\'message\”:“Success\”,“issucess\”:true,“data\”:{\'id\”:6,“eventId\”:1,“eventTitle\”:“Test Event\”,“startDate\”:“2020-10-10T00:00:00\”,“status\”:“Pending\”;
var multiItems=JsonConvert.DeserializeObject(json);
var singleItem=JsonConvert.DeserializeObject(json2);
}
公共类响应数据,其中T:类
{
公共字符串消息{get;set;}
公共布尔isSuccess{get;set;}
[JsonConverterAttribute(类型为(ItemOrListConverter))]
公共T数据{get;set;}
}
公开课注册
{
公共int id{get;set;}
public int eventId{get;set;}
公共字符串eventTitle{get;set;}
公共字符串startDate{get;set;}
公共字符串状态{get;set;}
}
公共类ItemOrListConverter:Newtonsoft.Json.JsonConverter
{
公共重写对象?ReadJson(JsonReader阅读器,类型objectType,对象?existingValue,JsonSerializer序列化程序)
{
var itemType=objectType.GetGenericArguments()[0];
var listType=typeof(List).MakeGenericType(itemType);
var result=Activator.CreateInstance(listType)作为IList;
if(reader.TokenType==JsonToken.StartObject)
{
var singleObject=serializer.Deserialize(reader,itemType);
结果.添加(singleObject);
}
else if(reader.TokenType==JsonToken.StartArray)
{
while(reader.Read())
{
if(reader.TokenType==JsonToken.EndArray)
打破
var singleObject=serializer.Deserialize(reader,itemType);
结果.添加(singleObject);
}
}
返回结果;
}
public override void WriteJson(JsonWriter writer,object?value,JsonSerializer序列化程序)
{
抛出新的NotImplementedException();
}
公共覆盖布尔CanConvert(类型objectType)
{
抛出新的NotImplementedException();
}
}
System.Text.Json
void Main()
{
var json=“{\'message\”:\“Success\”,\“issucess\”:true,\“data\”:[{\'id\”:6,\“eventId\”:1,\“eventTitle\”:“Test Event\”,\“startDate\”:“2020-10-10T00:00:00\,“status\”:“Pending\”,“{\'id\”:1,\“eventId\”:4,\“eventTitle\:“dung Test\”,“startDate\”,“startDate\”:“2020-10-10-10T00:00\”,“status\”,“status\”,\”,“status\”:“Denied\”,\”;
var json2=“{\'message\”:“Success\”,“issucess\”:true,“data\”:{\'id\”:6,“eventId\”:1,“eventTitle\”:“Test Event\”,“startDate\”:“2020-10-10T00:00:00\”,“status\”:“Pending\”;
反序列化(json).Dump();
反序列化(json2.Dump();
}
公共类响应数据,其中T:类
{
公共字符串消息{get;set;}
公共布尔isSuccess{get;set;}
[JsonConverterAttribute(类型(ItemOrListConverterFactory))]
公共T数据{get;set;}
}
公开课注册
{
公共int id{get;set;}
public int eventId{get;set;}
公共字符串eventTitle{get;set;}
公共字符串startDate{get;set;}
公共字符串状态{get;set;}
}
公共类ItemOrListConverterFactory:JsonConverterFactory
{
公共覆盖布尔CanConvert(类型为typeToConvert)
=>类型转换
.GetInterfaces()
.Any(i=>i.IsGenericType&&i.GetGenericTypeDefinition()==typeof(IEnumerable));
public override System.Text.Json.Serialization.JsonConverter?CreateConverter(键入typeToConvert,JsonSerializerOptions选项)
{
var itemType=typeToConvert
.GetInterfaces()
.First(i=>i.IsGenericType&&i.GetGenericTypeDefinition()==typeof(IEnumerable))
.GetGenericArguments()[0];
if(类型转换接口)
{
typeToConvert=typeof(列表)。MakeGenericType(itemType);
}
返回(JsonConverter)激活器.CreateInstance(
typeof(ItemOrListConverter).MakeGenericType(typeToConvert),
args:新对象[]{itemType});
}
}
公共类ItemOrListConverter:JsonConverter
{
私有只读类型_itemType;
公共ItemOrListConverter(类型itemType)
{
_itemType=itemType;
}
公共覆盖T Read(参考Utf8JsonReader reader,键入typeToConvert,JsonSerializerOptions选项)
{
var result=(IList)Activator.CreateInstance(typeToConvert);
if(reader.TokenType==JsonTokenType.StartObject)
{
var singleObject=JsonSerializer.Deserialize(ref reader,_itemType,options);
结果.添加(singleObject);
}
else if(reader.TokenType==JsonTokenType.StartArray)
{
while(reader.Read())
{
if(reader.TokenType==JsonTokenType.EndArray)
打破
var singleObject=JsonSerializer.Deserialize(ref reader,_itemType,options);
结果.添加(singleObject);
}
}
返回(T)结果;
}
公共重写无效写入(Utf8JsonWriter writer、T值、JsonSerializerOptions选项)
{
抛出新的
{
  "message": "Success",
  "isSuccess": true,
  "data": {
    "id": 6,
    "eventId": 1,
    "eventTitle": "Test Event",
    "startDate": "2020-10-10T00:00:00",
    "status": "Pending"
  }
}
void Main()
{
    var json = "{ \"message\": \"Success\", \"isSuccess\": true, \"data\": [ { \"id\": 6, \"eventId\": 1, \"eventTitle\": \"Test Event\", \"startDate\": \"2020-10-10T00:00:00\", \"status\": \"Pending\" }, { \"id\": 1, \"eventId\": 4, \"eventTitle\": \"dung test\", \"startDate\": \"2020-10-15T00:00:00\", \"status\": \"Denied\" } ]}";
    var json2 = "{ \"message\": \"Success\", \"isSuccess\": true, \"data\": { \"id\": 6, \"eventId\": 1, \"eventTitle\": \"Test Event\", \"startDate\": \"2020-10-10T00:00:00\", \"status\": \"Pending\" }}";

    var multiItems = JsonConvert.DeserializeObject<ResponseData<IList<Registration>>>(json);
    var singleItem = JsonConvert.DeserializeObject<ResponseData<IList<Registration>>>(json2);
}

public class ResponseData<T> where T : class
{
    public string message { get; set; }
    public Boolean isSuccess { get; set; }

    [JsonConverterAttribute(typeof(ItemOrListConverter))]
    public T data { get; set; }
}
public class Registration
{
    public int id { get; set; }
    public int eventId { get; set; }
    public string eventTitle { get; set; }
    public string startDate { get; set; }
    public string status { get; set; }
}

public class ItemOrListConverter : Newtonsoft.Json.JsonConverter
{
    public override object? ReadJson(JsonReader reader, Type objectType, object? existingValue, JsonSerializer serializer)
    {
        var itemType = objectType.GetGenericArguments()[0];
        var listType = typeof(List<>).MakeGenericType(itemType);

        var result = Activator.CreateInstance(listType) as IList;

        if (reader.TokenType == JsonToken.StartObject)
        {
            var singleObject = serializer.Deserialize(reader, itemType);
            result.Add(singleObject);
        }
        else if (reader.TokenType == JsonToken.StartArray)
        {
            while (reader.Read())
            {
                if (reader.TokenType == JsonToken.EndArray)
                    break;

                var singleObject = serializer.Deserialize(reader, itemType);
                result.Add(singleObject);
            }
        }

        return result;
    }

    public override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override bool CanConvert(Type objectType)
    {
        throw new NotImplementedException();
    }
}
void Main()
{
    var json = "{ \"message\": \"Success\", \"isSuccess\": true, \"data\": [ { \"id\": 6, \"eventId\": 1, \"eventTitle\": \"Test Event\", \"startDate\": \"2020-10-10T00:00:00\", \"status\": \"Pending\" }, { \"id\": 1, \"eventId\": 4, \"eventTitle\": \"dung test\", \"startDate\": \"2020-10-15T00:00:00\", \"status\": \"Denied\" } ]}";
    var json2 = "{ \"message\": \"Success\", \"isSuccess\": true, \"data\": { \"id\": 6, \"eventId\": 1, \"eventTitle\": \"Test Event\", \"startDate\": \"2020-10-10T00:00:00\", \"status\": \"Pending\" }}";

    JsonSerializer.Deserialize<ResponseData<IList<Registration>>>(json).Dump();
    JsonSerializer.Deserialize<ResponseData<IList<Registration>>>(json2).Dump();
}

public class ResponseData<T> where T : class
{
    public string message { get; set; }
    public Boolean isSuccess { get; set; }

    [JsonConverterAttribute(typeof(ItemOrListConverterFactory))]
    public T data { get; set; }
}
public class Registration
{
    public int id { get; set; }
    public int eventId { get; set; }
    public string eventTitle { get; set; }
    public string startDate { get; set; }
    public string status { get; set; }
}

public class ItemOrListConverterFactory : JsonConverterFactory
{
    public override bool CanConvert(Type typeToConvert)
        => typeToConvert
            .GetInterfaces()
            .Any(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IEnumerable<>));

    public override System.Text.Json.Serialization.JsonConverter? CreateConverter(Type typeToConvert, JsonSerializerOptions options)
    {
        var itemType = typeToConvert
            .GetInterfaces()
            .First(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IEnumerable<>))
            .GetGenericArguments()[0];

        if (typeToConvert.IsInterface)
        {
            typeToConvert = typeof(List<>).MakeGenericType(itemType);
        }

        return (JsonConverter)Activator.CreateInstance(
            typeof(ItemOrListConverter<>).MakeGenericType(typeToConvert),
            args: new object[] { itemType });
    }
}

public class ItemOrListConverter<T> : JsonConverter<T>
{
    private readonly Type _itemType;

    public ItemOrListConverter(Type itemType)
    {
        _itemType = itemType;
    }

    public override T Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        var result = (IList)Activator.CreateInstance(typeToConvert);

        if (reader.TokenType == JsonTokenType.StartObject)
        {
            var singleObject = JsonSerializer.Deserialize(ref reader, _itemType, options);
            result.Add(singleObject);
        }
        else if (reader.TokenType == JsonTokenType.StartArray)
        {
            while (reader.Read())
            {
                if (reader.TokenType == JsonTokenType.EndArray)
                    break;
                var singleObject = JsonSerializer.Deserialize(ref reader, _itemType, options);
                result.Add(singleObject);
            }
        }

        return (T)result;
    }

    public override void Write(Utf8JsonWriter writer, T value, JsonSerializerOptions options)
    {
        throw new NotImplementedException();
    }
}