我正在将复杂的json对象反序列化为POCO,然后使用 Microsoft.Azure.Cosmos.Table SDK将数据存储到Azure表存储中。但是,SDK不支持插入复杂类型。我正在寻找一种对json进行反序列化的方法,以使复杂类型保持序列化,而仅对简单类型进行反序列化。
这是我的班级定义:
public class Person
{
public string name {get; set;}
public int department {get; set;}
public List<Address> addresses {get; set;}
public Skill skill {get; set;}
}
现在,我需要反序列化json,以便地址和技能应保留为字符串,但其他属性应反序列化。这将使我可以将我的整个对象存储到Azure Table存储中,并显示用于地址和技能的列。我知道[JsonIgnore]只会忽略我不需要的属性。
有什么办法可以做到吗?
答案 0 :(得分:1)
这里的关键是使用不同的持久性类,该类将从JSON反序列化,我们将其命名为MockHttpServletRequest:
HTTP Method = POST
Request URI = /v1/address-service/internal/company/address
Parameters = {}
Headers = {Content-Type=[application/json]}
Body = <no character encoding set>
Session Attrs = {}
Handler:
Type = org.springframework.web.servlet.resource.ResourceHttpRequestHandler
Async:
Async started = false
Async result = null
Resolved Exception:
Type = null
ModelAndView:
View name = null
View = null
Model = null
FlashMap:
Attributes = null
MockHttpServletResponse:
Status = 404
Error message = null
Headers = {}
Content type = null
Body =
Forwarded URL = null
Redirected URL = null
Cookies = []
java.lang.AssertionError: Status
Expected :200
Actual :404
。
我可以想到两种方法:
基于@dbc建议的another answer on SO,创建一个自定义转换器:
PersistablePerson
持久性类如下:
public class RawConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(string);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
return reader.TokenType != JsonToken.Null
? JRaw.Create(reader).ToString()
: null;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
writer.WriteRawValue((string)value);
}
}
在可持久类中,将“复杂”属性加倍,以便每个这样的属性都由两个表示:
public class PersistablePerson
{
public string name {get; set;}
public int department {get; set;}
[JsonConverter(typeof(RawConverter))]
public string addresses {get; set;}
[JsonConverter(typeof(RawConverter))]
public string skill {get; set;}
}
属性:由JSON序列化程序处理,不包含在持久性中 JToken
属性设置器和getter是读取和写入string属性的包装器。
JToken