Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.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#_Json_.net Core - Fatal编程技术网

如何将值列表反序列化为C#对象

如何将值列表反序列化为C#对象,c#,json,.net-core,C#,Json,.net Core,我的应用程序接收一个JSON对象,如下所示: { "names": [ "name_1", "name_2" ] } 我想将其反序列化为Person对象的列表,定义为: 班级人员 { 公共字符串名称{set;get;} } 目前,我正在将JSON对象反序列化为字符串列表,然后手动创建Person列表,如下所示: var name=JsonConvert.DeserializeObject(json); var people=新列表(); foreach(名称中的变量名

我的应用程序接收一个JSON对象,如下所示:

{
  "names": [
    "name_1",
    "name_2"
  ]
}
我想将其反序列化为
Person
对象的列表,定义为:

班级人员
{
公共字符串名称{set;get;}
}
目前,我正在将JSON对象反序列化为字符串列表,然后手动创建
Person
列表,如下所示:

var name=JsonConvert.DeserializeObject(json);
var people=新列表();
foreach(名称中的变量名称)
添加(newperson(){Name=Name});
相反,我对以下内容感兴趣:

var people=JsonConvert.DeserializeObject(json);
我正在将
Person
反序列化器实现为:

公共类PersonJsonConverter:JsonConverter
{
私人现成字典(u property mappings);;
公共人员JSONConverter()
{
_propertyMappings=新字典
{
{“姓名”,姓名(人名)}
};
}
公共覆盖布尔CanConvert(类型objectType)
{
返回objectType.GetTypeInfo().IsClass;
}
公共重写对象ReadJson(
JsonReader阅读器,
类型objectType,
对象现有值,
JsonSerializer(序列化程序)
{
对象实例=Activator.CreateInstance(objectType);
var props=objectType.GetTypeInfo().DeclaredProperties.ToList();
JObject obj=JObject.Load(读卡器);
foreach(obj.Properties()中的JProperty jsonProperty)
{
if(!\u propertyMappings.TryGetValue(jsonProperty.Name,out var Name))
name=jsonProperty.name;
PropertyInfo prop=props.FirstOrDefault(
pi=>pi.CanWrite&&pi.Name==Name);
道具?设定值(
比如,,
jsonProperty.Value.ToObject(prop.PropertyType,序列化程序));
}
返回实例;
}
}
此反序列化程序可以反序列化对象,例如:

{
  "names": [
    "name": "name_1",
    "name": "name_2"
  ]
}
但不是

{
  "names": [
    "name_1",
    "name_2"
  ]
}

请注意,我的应用程序可以接收这两种类型的JSON对象,因此最好为这两种类型都使用一个通用的反序列化程序。

您必须将
名称反序列化为类似
JArray
的内容,然后
foreach
每个条目都有一个
新人('name')
。接收到的JSON与所需的模式不匹配。您必须手动转换它。

您必须将
名称
反序列化为类似
JArray的东西,然后
foreach
每个条目都有一个
新人('name')
。接收到的JSON与所需的模式不匹配。您必须手动转换它。

请尝试以下操作:

class Person
{
    public string Name { set; get; }
}

public class PersonJsonConverter : JsonConverter
{
    // private readonly Dictionary<string, string> _propertyMappings;

    public PersonJsonConverter()
    {
        /*_propertyMappings = new Dictionary<string, string>
        {
            {"name", nameof(Person.Name)}
        };*/
    }

    public override bool CanConvert(System.Type objectType)
    {
        return objectType.GetTypeInfo().IsClass;
    }

    public override object ReadJson(JsonReader reader, System.Type objectType, object existingValue, JsonSerializer serializer)
    {
        object instance = Activator.CreateInstance(objectType);
        // List<T> implements the non-generic IList interface
        IList list = (IList)instance;
        var typeInfo = objectType.GetTypeInfo();
        var props = typeInfo.DeclaredProperties.ToList();
        PropertyInfo prop = props.FirstOrDefault(pi => pi.PropertyType == typeof(Person));

        JObject obj = JObject.Load(reader);
        var namesArray = obj["names"]; // you can use this instead of for loop on obj.Properties.
        /*foreach (JProperty jsonProperty in obj.Properties())
        {
            if (jsonProperty.Name == "names")
            {
                var namesArray = JArray.Parse(jsonProperty.Value.ToString());
                */
                if (namesArray.Type == JTokenType.Array && prop != null)
                {
                    foreach (var ja in namesArray)
                    {
                        object personInstance = Activator.CreateInstance(prop.PropertyType);
                        PropertyInfo personNamePropInfo = prop.PropertyType.GetProperty(nameof(Person.Name));
                        personNamePropInfo.SetValue(personInstance,
                            Convert.ChangeType(ja, personNamePropInfo.PropertyType), null);
                        list.Add(personInstance); // Whatever you need to add
                    }
                }

          /*      break;
            }
        }*/

        return instance;
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}
班级人员
{
公共字符串名称{set;get;}
}
公共类PersonJsonConverter:JsonConverter
{
//私人现成字典(u property mappings);;
公共人员JSONConverter()
{
/*_propertyMappings=新字典
{
{“姓名”,姓名(人名)}
};*/
}
公共覆盖布尔CanConvert(System.Type objectType)
{
返回objectType.GetTypeInfo().IsClass;
}
公共重写对象ReadJson(JsonReader阅读器、System.Type对象类型、对象existingValue、JsonSerializer序列化程序)
{
对象实例=Activator.CreateInstance(objectType);
//列表实现非通用IList接口
IList list=(IList)实例;
var typeInfo=objectType.GetTypeInfo();
var props=typeInfo.DeclaredProperties.ToList();
PropertyInfo prop=props.FirstOrDefault(pi=>pi.PropertyType==typeof(Person));
JObject obj=JObject.Load(读卡器);
var namesArray=obj[“names”];//您可以在obj.Properties上使用它而不是for循环。
/*foreach(obj.Properties()中的JProperty jsonProperty)
{
if(jsonProperty.Name==“Name”)
{
var namesArray=JArray.Parse(jsonProperty.Value.ToString());
*/
if(namesArray.Type==JTokenType.Array&&prop!=null)
{
foreach(namesArray中的var ja)
{
object personInstance=Activator.CreateInstance(prop.PropertyType);
PropertyInfo personNamePropInfo=prop.PropertyType.GetProperty(nameof(Person.Name));
personNamePropInfo.SetValue(personInstance,
ChangeType(ja,personNamePropInfo.PropertyType),null;
list.Add(personInstance);//需要添加的任何内容
}
}
/*中断;
}
}*/
返回实例;
}
公共重写void WriteJson(JsonWriter编写器、对象值、JsonSerializer序列化器)
{
抛出新的NotImplementedException();
}
}
并按如下方式使用:

var samplejson = @"{
  ""names"": [
    ""name_1"",
    ""name_2""
  ]
}";
var obj = JsonConvert.DeserializeObject<List<Person>>(samplejson,   new JsonConverter[] { new PersonJsonConverter() });
var samplejson=@”{
“姓名”:[
“名称_1”,
“”名称\u 2“”
]
}";
var obj=JsonConvert.DeserializeObject(samplejson,new JsonConverter[]{new PersonJsonConverter()});
另一个json似乎不是有效的json。 请尝试以下操作:

class Person
{
    public string Name { set; get; }
}

public class PersonJsonConverter : JsonConverter
{
    // private readonly Dictionary<string, string> _propertyMappings;

    public PersonJsonConverter()
    {
        /*_propertyMappings = new Dictionary<string, string>
        {
            {"name", nameof(Person.Name)}
        };*/
    }

    public override bool CanConvert(System.Type objectType)
    {
        return objectType.GetTypeInfo().IsClass;
    }

    public override object ReadJson(JsonReader reader, System.Type objectType, object existingValue, JsonSerializer serializer)
    {
        object instance = Activator.CreateInstance(objectType);
        // List<T> implements the non-generic IList interface
        IList list = (IList)instance;
        var typeInfo = objectType.GetTypeInfo();
        var props = typeInfo.DeclaredProperties.ToList();
        PropertyInfo prop = props.FirstOrDefault(pi => pi.PropertyType == typeof(Person));

        JObject obj = JObject.Load(reader);
        var namesArray = obj["names"]; // you can use this instead of for loop on obj.Properties.
        /*foreach (JProperty jsonProperty in obj.Properties())
        {
            if (jsonProperty.Name == "names")
            {
                var namesArray = JArray.Parse(jsonProperty.Value.ToString());
                */
                if (namesArray.Type == JTokenType.Array && prop != null)
                {
                    foreach (var ja in namesArray)
                    {
                        object personInstance = Activator.CreateInstance(prop.PropertyType);
                        PropertyInfo personNamePropInfo = prop.PropertyType.GetProperty(nameof(Person.Name));
                        personNamePropInfo.SetValue(personInstance,
                            Convert.ChangeType(ja, personNamePropInfo.PropertyType), null);
                        list.Add(personInstance); // Whatever you need to add
                    }
                }

          /*      break;
            }
        }*/

        return instance;
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}
班级人员
{
公共字符串名称{set;get;}
}
公共类PersonJsonConverter:JsonConverter
{
//私人现成字典(u property mappings);;
公共人员JSONConverter()
{
/*_propertyMappings=新字典
{
{“姓名”,姓名(人名)}
};*/
}
公共覆盖布尔CanConvert(System.Type objectType)
{
返回objectType.GetTypeInfo().IsClass;
}
公共重写对象ReadJson(JsonReader阅读器、System.Type对象类型、对象existingValue、JsonSerializer序列化程序)
{
对象实例=Activator.CreateInstance(objectType);
//列表实现非通用IList接口
IList list=(IList)实例;
var typeInfo=对象