我的Json是
.values[] | {name, downloads}
我希望将此JSON转换为以下对象
{
Id: 1,
Name:'Alex',
ConnectedObjectName:'Obj',
ConnectedObjectId: 99
}
有没有办法使用DataContractJsonSerializer
来实现这一目标答案 0 :(得分:7)
大多数序列化程序都希望对象和数据共享一个布局 - 因此大多数json序列化程序都希望ConnectedObjectName
和ConnectedObjectId
存在于根对象上,而不是内部对象上。通常,如果数据不适合您想要映射到的数据,最好的方法是使用与数据和序列化器匹配的单独DTO模型,然后从DTO模型映射到您想要以编程方式使用的实际模型,或使用自动映射器等工具。
如果您使用DTO方法,几乎所有 JSON反序列化器都可以。 Json.NET
是一个很好的默认值。 DataContractJsonSerializer将在我的JSONserializers列表中以方式向下来考虑。
答案 1 :(得分:0)
为了扩展Marc Gravell所说的内容,大多数JSON序列化程序都希望你的JSON看起来如下,它会正确地映射到你的类:
{
"Id": 1,
"Name": "Alex",
"Obj" : {
"COName": "Obj",
"COId": 99
}
}
解决这个问题的方法是将JSON读入与之匹配的对象,然后将该对象映射到您想要的对象:
反序列化为此对象:
class COJson {
public int Id;
public string Name;
public string ConnectedObjectName;
public int ConnectedObjectId;
}
然后映射到此对象:
class Response {
public int Id;
public string Name;
public ConnectedObject Obj;
}
class ConnectedObject {
public string COName;
public string COId;
}
像这样:
using(var stream = new MemoryStream(Encoding.Unicode.GetBytes(json)))
{
var serializer = new DataContractJsonSerializer(typeof(COJson));
var jsonDto = (COJson)ser.ReadObject(stream);
var dto = new Response(){
Id = jsonDto.Id,
Name = jsonDto.Name,
Obj = new ConnectedObject(){
COName = jsonDto.ConnectedObjectName,
COId = jsonDto.ConnectedObjectId
}
};
return dto;
}