Json.NET을 사용하여 ArrayList의 ArrayList를 직렬화 및 역 직렬화하는 방법

보리스 졸로토 프

내 응용 프로그램에서 JSON.NET을 사용하여 객체를 json으로 직렬화 / 역 직렬화해야합니다. 객체에는 문자열 배열을 포함하는 ArrayList의 속성 유형이 있습니다. 이를 시뮬레이션하기 위해 다음 단위 테스트를 작성했습니다.

public class JsonTests
{
    public class MyTestClass
    {
        public ArrayList Items { get; private set; }

        public MyTestClass()
        {
            this.Items = new ArrayList();
        }
    }
    [Fact]
    public void JsonConvert_Should_Serialize_ArrayList_And_Deserialize_Successfully()
    {
        MyTestClass myObject = new MyTestClass();
        myObject.Items.Add(new string[] { "Test1", "Test2" });
        string jsonResult = JsonConvert.SerializeObject(myObject);            
        MyTestClass tempMyObject = JsonConvert.DeserializeObject<MyTestClass>(jsonResult);
         //(tempMyObject.Items[0] as string[]) casts to null therefore it throws exception
        Assert.Equal((myObject.Items[0] as string[])[0], (tempMyObject.Items[0] as string[])[0]);
    } 
}

예외 기간 직렬화는 발생하지 않습니다. 그러나 ArrayList를 제대로 deserialize하지 않습니다.

내 질문은 어떻게 문자열 배열의 ArrayList로 다시 역 직렬화 할 수 있습니까?

업데이트 : 또한 클래스 정의를 변경할 수 없습니다. 클래스를 편집 할 수없는 어셈블리에서 클래스가 구현되었습니다.

dbc

ArrayList유형이 지정되지 않은 일반 컬렉션이 아니므로 Json.NET에 예상 항목 유형을 알려야합니다. 이를 수행하는 한 가지 방법은에 대한 사용자 지정JsonConverter 을 사용하는 것입니다 ArrayList.

public class ArrayListConverter<TItem> : JsonConverter
{
    public override bool CanWrite { get { return false; } }

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

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.Null)
            return null;
        var list = serializer.Deserialize<List<TItem>>(reader);
        var arrayList = existingValue as ArrayList ?? new ArrayList(list.Count);
        arrayList.AddRange(list);
        return arrayList;
    }

    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(ArrayList);
    }
}

그런 다음 다음과 같이 변환기를 클래스에 적용하십시오.

public class MyTestClass
{
    [JsonConverter(typeof(ArrayListConverter<string []>))]
    public ArrayList Items { get; private set; }

    public MyTestClass()
    {
        this.Items = new ArrayList();
    }
}

샘플 바이올린 .

클래스를 수정할 수없고 개체 그래프 모든 인스턴스ArrayList항목을로 역 직렬화하도록 string []하려면 변환기를 JsonSerializerSettings.Converters형식에 추가하는 대신에 추가 할 수 있습니다 .

var tempMyObject = JsonConvert.DeserializeObject<MyTestClass>(jsonResult,
                                                              new JsonSerializerSettings { Converters = { new ArrayListConverter<string []>() } });

샘플 바이올린 # 2 .

마지막으로, 클래스를 수정할 수없고 ArrayList Items내부 의 특정 속성 MyTestClass해당 항목이으로 역 직렬화되도록 string []하려면 .NET 용 사용자 지정 변환기를 만들어야합니다 MyTestClass. json.NET 이있는 일부 필드에 대해서만 Custom deserializer 의 패턴을 사용하여 ArrayList속성 을 사용자 지정 역 직렬화 하고 나머지는 기본 역 직렬화 로 채울 수 있습니다 .

public class MyTestClassConverter : JsonConverter
{
    public override bool CanWrite { get { return false; } }

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

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.Null)
            return null;
        var root = existingValue as MyTestClass ?? (MyTestClass)serializer.ContractResolver.ResolveContract(objectType).DefaultCreator();
        var jsonObject = JObject.Load(reader);

        var jsonItems = jsonObject["Items"].RemoveFromLowestPossibleParent();
        if (jsonItems != null && jsonItems.Type != JTokenType.Null)
        {
            root.Items.AddRange(jsonItems.ToObject<List<string []>>());
        }
        // Populate the remaining standard properties
        using (var subReader = jsonObject.CreateReader())
        {
            serializer.Populate(subReader, root);
        }
        return root;
    }

    public override bool CanConvert(Type objectType)
    {
        return typeof(MyTestClass).IsAssignableFrom(objectType);
    }
}

public static class JsonExtensions
{
    public static JToken RemoveFromLowestPossibleParent(this JToken node)
    {
        if (node == null)
            return null;
        var contained = node.AncestorsAndSelf().Where(t => t.Parent is JContainer && t.Parent.Type != JTokenType.Property).FirstOrDefault();
        if (contained != null)
            contained.Remove();
        // Also detach the node from its immediate containing property -- Remove() does not do this even though it seems like it should
        if (node.Parent is JProperty)
            ((JProperty)node.Parent).Value = null;
        return node;
    }
}

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

var tempMyObject = JsonConvert.DeserializeObject<MyTestClass>(jsonResult,
                                                              new JsonSerializerSettings { Converters = { new MyTestClassConverter() } });

샘플 바이올린 # 3 .

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

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

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Play의 json을 사용하여 동적 필드 이름을 직렬화 / 역 직렬화하는 방법

분류에서Dev

Jackson을 사용하여 JAVA 클래스를 대상으로하는 JSON 직렬화 및 역 직렬화

분류에서Dev

JavaScriptSerializer를 사용하여 JSON을 튜플으로 역 직렬화하는 방법

분류에서Dev

JSON.NET을 사용하여 dictionary <string, object> 역 직렬화 및 직렬화

분류에서Dev

Unity에서 GameObject 및 Vector2를 포함하는 사전을 직렬화 및 역 직렬화하는 방법

분류에서Dev

REST API의 HTTP 메서드에 대한 요청 및 응답에서 Json 직렬화 또는 역 직렬화를 적용하는 방법

분류에서Dev

.NET DataContractJsonSerializer serializer를 사용하여 사전으로 JSON 직렬화 / 역 직렬화

분류에서Dev

.NET DataContractJsonSerializer serializer를 사용하여 사전으로 JSON 직렬화 / 역 직렬화

분류에서Dev

파일에서 개체를 역 직렬화 및 재 직렬화하는 데 문제가있는 C # JSON.net

분류에서Dev

DataGridView를 채우기 위해 JSON 파일을 DataTable로 직렬화 및 역 직렬화하는 방법은 무엇입니까?

분류에서Dev

DataGridView를 채우기 위해 JSON 파일을 DataTable로 직렬화 및 역 직렬화하는 방법은 무엇입니까?

분류에서Dev

ASP.NET Web API-JSON을 역 직렬화하는 방법

분류에서Dev

Jackson 및 @JSonPOJOBuilder를 사용하여 JSON을 역 직렬화하는 동안 파서 컨텍스트를 검색하는 방법

분류에서Dev

C #을 사용하여 XML 파일에서 데이터를 직렬화 및 역 직렬화하는 방법은 무엇입니까?

분류에서Dev

JSON을 사용하여 2D 배열을 역 직렬화하는 방법

분류에서Dev

GSON를 사용하여 알 수없는 원시적 인 JSON 속성 유형을 역 직렬화하는 방법

분류에서Dev

Jackson을 사용하여 Lambda 직렬화 및 역 직렬화

분류에서Dev

Android : Retrofit 및 Jackson을 사용하여 동적 JSON 역 직렬화

분류에서Dev

@@를 포함하는 json 문자열을 scala로 역 직렬화하는 방법 '

분류에서Dev

System.Text.Json API를 사용하여 스트림을 개체로 역 직렬화하는 방법

분류에서Dev

JsonSerializer를 사용하여 이기종 JSON 배열을 역 직렬화하는 방법은 무엇입니까?

분류에서Dev

serde를 사용하여 JSON 배열을 구조체로 역 직렬화하는 방법은 무엇입니까?

분류에서Dev

정수를 키로 사용하여 JSON을 역 직렬화하는 방법은 무엇입니까?

분류에서Dev

@JsonProperty를 사용하여 JSON 응답을 역 직렬화하는 방법은 무엇입니까?

분류에서Dev

C # Newtonsoft를 사용하여 JSON 파일을 역 직렬화하는 방법은 무엇입니까?

분류에서Dev

JSON.Net deserializer를 사용하여 동적 JSON 역 직렬화

분류에서Dev

자식 개체 ASP.NET Core를 JSON 역 직렬화하는 방법

분류에서Dev

Jackson을 사용하여 임의의 JSON 역 직렬화

분류에서Dev

ArrayList를 다른 동작을 갖는 목록에 JSON 개체를 역 직렬화하는 가장 좋은 방법은 무엇입니까

Related 관련 기사

  1. 1

    Play의 json을 사용하여 동적 필드 이름을 직렬화 / 역 직렬화하는 방법

  2. 2

    Jackson을 사용하여 JAVA 클래스를 대상으로하는 JSON 직렬화 및 역 직렬화

  3. 3

    JavaScriptSerializer를 사용하여 JSON을 튜플으로 역 직렬화하는 방법

  4. 4

    JSON.NET을 사용하여 dictionary <string, object> 역 직렬화 및 직렬화

  5. 5

    Unity에서 GameObject 및 Vector2를 포함하는 사전을 직렬화 및 역 직렬화하는 방법

  6. 6

    REST API의 HTTP 메서드에 대한 요청 및 응답에서 Json 직렬화 또는 역 직렬화를 적용하는 방법

  7. 7

    .NET DataContractJsonSerializer serializer를 사용하여 사전으로 JSON 직렬화 / 역 직렬화

  8. 8

    .NET DataContractJsonSerializer serializer를 사용하여 사전으로 JSON 직렬화 / 역 직렬화

  9. 9

    파일에서 개체를 역 직렬화 및 재 직렬화하는 데 문제가있는 C # JSON.net

  10. 10

    DataGridView를 채우기 위해 JSON 파일을 DataTable로 직렬화 및 역 직렬화하는 방법은 무엇입니까?

  11. 11

    DataGridView를 채우기 위해 JSON 파일을 DataTable로 직렬화 및 역 직렬화하는 방법은 무엇입니까?

  12. 12

    ASP.NET Web API-JSON을 역 직렬화하는 방법

  13. 13

    Jackson 및 @JSonPOJOBuilder를 사용하여 JSON을 역 직렬화하는 동안 파서 컨텍스트를 검색하는 방법

  14. 14

    C #을 사용하여 XML 파일에서 데이터를 직렬화 및 역 직렬화하는 방법은 무엇입니까?

  15. 15

    JSON을 사용하여 2D 배열을 역 직렬화하는 방법

  16. 16

    GSON를 사용하여 알 수없는 원시적 인 JSON 속성 유형을 역 직렬화하는 방법

  17. 17

    Jackson을 사용하여 Lambda 직렬화 및 역 직렬화

  18. 18

    Android : Retrofit 및 Jackson을 사용하여 동적 JSON 역 직렬화

  19. 19

    @@를 포함하는 json 문자열을 scala로 역 직렬화하는 방법 '

  20. 20

    System.Text.Json API를 사용하여 스트림을 개체로 역 직렬화하는 방법

  21. 21

    JsonSerializer를 사용하여 이기종 JSON 배열을 역 직렬화하는 방법은 무엇입니까?

  22. 22

    serde를 사용하여 JSON 배열을 구조체로 역 직렬화하는 방법은 무엇입니까?

  23. 23

    정수를 키로 사용하여 JSON을 역 직렬화하는 방법은 무엇입니까?

  24. 24

    @JsonProperty를 사용하여 JSON 응답을 역 직렬화하는 방법은 무엇입니까?

  25. 25

    C # Newtonsoft를 사용하여 JSON 파일을 역 직렬화하는 방법은 무엇입니까?

  26. 26

    JSON.Net deserializer를 사용하여 동적 JSON 역 직렬화

  27. 27

    자식 개체 ASP.NET Core를 JSON 역 직렬화하는 방법

  28. 28

    Jackson을 사용하여 임의의 JSON 역 직렬화

  29. 29

    ArrayList를 다른 동작을 갖는 목록에 JSON 개체를 역 직렬화하는 가장 좋은 방법은 무엇입니까

뜨겁다태그

보관