값 목록을 C # 개체로 역 직렬화하는 방법

하메드

내 애플리케이션은 JSON 객체를 다음과 같이받습니다.

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

Person다음과 같이 정의 된 개체 목록으로 역 직렬화하고 싶습니다 .

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

현재 JSON 개체를 문자열 목록으로 역 직렬화 Person하고 다음과 같이 수동으로 목록을 만듭니다 .

var names = JsonConvert.DeserializeObject<List<string>>(json);
var people = new List<Person>();
foreach(var name in names)
    people.Add(new Person(){ Name = name });

대신 다음과 같은 것에 관심이 있습니다.

var people = JsonConvert.DeserializeObject<List<Person>>(json);

Persondeserializer를 다음과 같이 구현하고 있습니다.

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(Type objectType)
    {
        return objectType.GetTypeInfo().IsClass;
    }

    public override object ReadJson(
        JsonReader reader,
        Type objectType,
        object existingValue,
        JsonSerializer serializer)
    {
        object instance = Activator.CreateInstance(objectType);
        var props = objectType.GetTypeInfo().DeclaredProperties.ToList();

        JObject obj = JObject.Load(reader);
        foreach (JProperty jsonProperty in obj.Properties())
        {
            if (!_propertyMappings.TryGetValue(jsonProperty.Name, out var name))
                name = jsonProperty.Name;

            PropertyInfo prop = props.FirstOrDefault(
                pi => pi.CanWrite && pi.Name == name);

            prop?.SetValue(
                instance,
                jsonProperty.Value.ToObject(prop.PropertyType, serializer));
        }

        return instance;
    }
}

이 deserializer는 다음과 같은 개체를 deserilize 할 수 있습니다.

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

하지만

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

내 애플리케이션은 두 가지 유형의 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();
    }
}

다음과 같이 사용하십시오.

var samplejson = @"{
  ""names"": [
    ""name_1"",
    ""name_2""
  ]
}";
var obj = JsonConvert.DeserializeObject<List<Person>>(samplejson,   new JsonConverter[] { new PersonJsonConverter() });

다른 json은 유효한 json이 아닌 것 같습니다. 여기에 이미지 설명 입력

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

C #에서 XML을 개체로 역 직렬화하는 방법

분류에서Dev

C #에서 테이블과 값으로 JSON을 역 직렬화하는 방법

분류에서Dev

XML 파일을 개체 목록으로 역 직렬화하는 방법

분류에서Dev

JSON을 C # 개체로 변환하는 방법 JSON을 역 직렬화하는 방법

분류에서Dev

XML 노드의 값을 기반으로 자식 개체를 부모 목록 (예 : List <Parent>)으로 역 직렬화하는 방법은 무엇입니까?

분류에서Dev

C #으로 JSON 파일을 역 직렬화하는 방법

분류에서Dev

클래스 문자열 값으로 개체를 역 직렬화하는 방법

분류에서Dev

JSON을 C # 개체 목록으로 역 직렬화

분류에서Dev

C # XML을 개체 목록으로 역 직렬화

분류에서Dev

Jackson : 속기 속성 값으로 json을 역 직렬화하는 방법

분류에서Dev

내 XML 행을 C # 개체로 직렬화하는 방법

분류에서Dev

이 C # 반환 값을 JSON 개체로 직렬화하는 방법은 무엇입니까?

분류에서Dev

JSON 목록을 C #의 개체 목록으로 역 직렬화 할 수 없음

분류에서Dev

JSON 목록 역 직렬화 후 개체를 조작하는 방법

분류에서Dev

JSON을 C # 개체로 역 직렬화

분류에서Dev

JSON 문자열을 객체로 역 직렬화하는 방법

분류에서Dev

개체에서 지역 변수 C #으로 값을 가져 오는 방법

분류에서Dev

JSON.NET : 부모 (홀더) 개체 값을 기반으로 인터페이스 속성을 역 직렬화하는 방법은 무엇입니까?

분류에서Dev

JSON을 C # 개체로 역 직렬화하는 데 문제가 있습니다.

분류에서Dev

Newtonsoft.Json 라이브러리를 사용하여 문자열을 C #을 사용하여 사용자 지정 개체로 역 직렬화하는 방법

분류에서Dev

JSON 개체를 .Net 목록으로 역 직렬화 (C #)

분류에서Dev

C #의 목록이있는 개체에 XML 역 직렬화

분류에서Dev

C #에서 JSON을 개체로 역 직렬화하면 값이 매핑되지 않습니다.

분류에서Dev

MediaWiki API 결과 C #을 역 직렬화하는 방법

분류에서Dev

C #에서 JSON 배열을 역 직렬화하는 방법

분류에서Dev

C #에서 JSON을 역 직렬화하는 방법

분류에서Dev

클래스 이름을 동적 값으로 사용하여 json을 역 직렬화하는 방법

분류에서Dev

System.Runtime.Serialization.Json을 사용하여 JSON 배열을 목록으로 역 직렬화하는 방법

분류에서Dev

Jackson을 사용하여 JSON 배열을 단일 연결 목록으로 역 직렬화하는 방법

Related 관련 기사

  1. 1

    C #에서 XML을 개체로 역 직렬화하는 방법

  2. 2

    C #에서 테이블과 값으로 JSON을 역 직렬화하는 방법

  3. 3

    XML 파일을 개체 목록으로 역 직렬화하는 방법

  4. 4

    JSON을 C # 개체로 변환하는 방법 JSON을 역 직렬화하는 방법

  5. 5

    XML 노드의 값을 기반으로 자식 개체를 부모 목록 (예 : List <Parent>)으로 역 직렬화하는 방법은 무엇입니까?

  6. 6

    C #으로 JSON 파일을 역 직렬화하는 방법

  7. 7

    클래스 문자열 값으로 개체를 역 직렬화하는 방법

  8. 8

    JSON을 C # 개체 목록으로 역 직렬화

  9. 9

    C # XML을 개체 목록으로 역 직렬화

  10. 10

    Jackson : 속기 속성 값으로 json을 역 직렬화하는 방법

  11. 11

    내 XML 행을 C # 개체로 직렬화하는 방법

  12. 12

    이 C # 반환 값을 JSON 개체로 직렬화하는 방법은 무엇입니까?

  13. 13

    JSON 목록을 C #의 개체 목록으로 역 직렬화 할 수 없음

  14. 14

    JSON 목록 역 직렬화 후 개체를 조작하는 방법

  15. 15

    JSON을 C # 개체로 역 직렬화

  16. 16

    JSON 문자열을 객체로 역 직렬화하는 방법

  17. 17

    개체에서 지역 변수 C #으로 값을 가져 오는 방법

  18. 18

    JSON.NET : 부모 (홀더) 개체 값을 기반으로 인터페이스 속성을 역 직렬화하는 방법은 무엇입니까?

  19. 19

    JSON을 C # 개체로 역 직렬화하는 데 문제가 있습니다.

  20. 20

    Newtonsoft.Json 라이브러리를 사용하여 문자열을 C #을 사용하여 사용자 지정 개체로 역 직렬화하는 방법

  21. 21

    JSON 개체를 .Net 목록으로 역 직렬화 (C #)

  22. 22

    C #의 목록이있는 개체에 XML 역 직렬화

  23. 23

    C #에서 JSON을 개체로 역 직렬화하면 값이 매핑되지 않습니다.

  24. 24

    MediaWiki API 결과 C #을 역 직렬화하는 방법

  25. 25

    C #에서 JSON 배열을 역 직렬화하는 방법

  26. 26

    C #에서 JSON을 역 직렬화하는 방법

  27. 27

    클래스 이름을 동적 값으로 사용하여 json을 역 직렬화하는 방법

  28. 28

    System.Runtime.Serialization.Json을 사용하여 JSON 배열을 목록으로 역 직렬화하는 방법

  29. 29

    Jackson을 사용하여 JSON 배열을 단일 연결 목록으로 역 직렬화하는 방법

뜨겁다태그

보관