반응형
JSON을 사용하여 개체 직렬화/비직렬화 사전.그물
serialize/deserialize를 시도하고 있습니다.Dictionary<string, object>
오브젝트가 단순한 타입이라면 정상적으로 동작하는 것처럼 보이지만 오브젝트가 복잡하면 동작하지 않습니다.
저는 다음 수업이 있습니다.
public class UrlStatus
{
public int Status { get; set; }
public string Url { get; set; }
}
내 사전에 a를 추가한다.List<UrlStatus>
"Redirect Chain" 키와 "Status", "Url", "Parent Url" 키를 가진 몇 개의 간단한 문자열을 사용합니다.JSON에게 돌려받을 끈.넷은 다음과 같습니다.
{"$type":"System.Collections.Generic.Dictionary`2[[System.String, mscorlib],[System.Object, mscorlib]], mscorlib","Status":"OK","Url":"http://www.ehow.com/m/how_5615409_create-pdfs-using-bean.html","Parent Url":"http://www.ehow.com/mobilearticle35.xml","Redirect Chain":[{"$type":"Demand.TestFramework.Core.Entities.UrlStatus, Demand.TestFramework.Core","Status":301,"Url":"http://www.ehow.com/how_5615409_create-pdfs-using-bean.html"}]}
시리얼화에 사용하는 코드는 다음과 같습니다.
JsonConvert.SerializeObject(collection, Formatting.None, new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.Objects,
TypeNameAssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple
});
내가 하고 있는 것을 직시하지 않기 위해서:
JsonConvert.DeserializeObject<T>(collection, new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.Objects,
TypeNameAssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple,
});
사전은 정상적으로 반환되고 모든 문자열은 정상적으로 반환되지만 목록이 제대로 역직렬화되지 않습니다.결국 로 돌아온다.
{[
{
"$type": "XYZ.TestFramework.Core.Entities.UrlStatus, XYZ.TestFramework.Core",
"Status": 301,
"Url": "/how_5615409_create-pdfs-using-bean.html"
}
]}
물론 이 스트링을 다시 디세일화하면 올바른 오브젝트를 얻을 수 있지만 JSON처럼 보입니다.넷이 이걸 해줬어야 했는데분명히 내가 뭔가 잘못하고 있는 것 같은데 그게 뭔지 모르겠어.
그것은 이전 버전의 Json의 버그라고 생각합니다.NET. 최신 버전을 아직 사용하지 않은 경우 업그레이드한 후 다시 시도하십시오.
public class UrlStatus
{
public int Status { get; set; }
public string Url { get; set; }
}
[TestMethod]
public void GenericDictionaryObject()
{
Dictionary<string, object> collection = new Dictionary<string, object>()
{
{"First", new UrlStatus{ Status = 404, Url = @"http://www.bing.com"}},
{"Second", new UrlStatus{Status = 400, Url = @"http://www.google.com"}},
{"List", new List<UrlStatus>
{
new UrlStatus {Status = 300, Url = @"http://www.yahoo.com"},
new UrlStatus {Status = 200, Url = @"http://www.askjeeves.com"}
}
}
};
string json = JsonConvert.SerializeObject(collection, Formatting.Indented, new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.All,
TypeNameAssemblyFormat = FormatterAssemblyStyle.Simple
});
Assert.AreEqual(@"{
""$type"": ""System.Collections.Generic.Dictionary`2[[System.String, mscorlib],[System.Object, mscorlib]], mscorlib"",
""First"": {
""$type"": ""Newtonsoft.Json.Tests.Serialization.TypeNameHandlingTests+UrlStatus, Newtonsoft.Json.Tests"",
""Status"": 404,
""Url"": ""http://www.bing.com""
},
""Second"": {
""$type"": ""Newtonsoft.Json.Tests.Serialization.TypeNameHandlingTests+UrlStatus, Newtonsoft.Json.Tests"",
""Status"": 400,
""Url"": ""http://www.google.com""
},
""List"": {
""$type"": ""System.Collections.Generic.List`1[[Newtonsoft.Json.Tests.Serialization.TypeNameHandlingTests+UrlStatus, Newtonsoft.Json.Tests]], mscorlib"",
""$values"": [
{
""$type"": ""Newtonsoft.Json.Tests.Serialization.TypeNameHandlingTests+UrlStatus, Newtonsoft.Json.Tests"",
""Status"": 300,
""Url"": ""http://www.yahoo.com""
},
{
""$type"": ""Newtonsoft.Json.Tests.Serialization.TypeNameHandlingTests+UrlStatus, Newtonsoft.Json.Tests"",
""Status"": 200,
""Url"": ""http://www.askjeeves.com""
}
]
}
}", json);
object c = JsonConvert.DeserializeObject(json, new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.All,
TypeNameAssemblyFormat = FormatterAssemblyStyle.Simple
});
Assert.IsInstanceOfType(c, typeof(Dictionary<string, object>));
Dictionary<string, object> newCollection = (Dictionary<string, object>)c;
Assert.AreEqual(3, newCollection.Count);
Assert.AreEqual(@"http://www.bing.com", ((UrlStatus)newCollection["First"]).Url);
List<UrlStatus> statues = (List<UrlStatus>) newCollection["List"];
Assert.AreEqual(2, statues.Count);
}
}
편집, 방금 당신이 목록을 언급했다는 걸 알아챘어요.TypeNameHandling은 All로 설정해야 합니다.
문서:유형 이름 처리 설정
언급URL : https://stackoverflow.com/questions/3739094/serializing-deserializing-dictionary-of-objects-with-json-net
반응형
'programing' 카테고리의 다른 글
리액트 훅을 사용한 초기 상태로 리셋 (0) | 2023.02.22 |
---|---|
React에서 .map()을 사용하는 경우의 빈 배열 처리 (0) | 2023.02.22 |
리액트 테스트 라이브러리를 사용하여 html 태그를 포함하는 텍스트 문자열로 쿼리하려면 어떻게 해야 합니다. (0) | 2023.02.22 |
특정 JDBC 접속의 데이터베이스 유형을 판별하려면 어떻게 해야 합니까? (0) | 2023.02.22 |
Oracle이 없는 경우 삽입 (0) | 2023.02.22 |