在c#中将简单的Json转换为复杂对象

时间:2018-03-16 15:33:09

标签: c# json

我的Json是

.values[] | {name, downloads} 

我希望将此JSON转换为以下对象

{
Id: 1,
Name:'Alex',
ConnectedObjectName:'Obj',
ConnectedObjectId: 99
}

有没有办法使用DataContractJsonSerializer

来实现这一目标

2 个答案:

答案 0 :(得分:7)

大多数序列化程序都希望对象和数据共享一个布局 - 因此大多数json序列化程序都希望ConnectedObjectNameConnectedObjectId存在于根对象上,而不是内部对象上。通常,如果数据不适合您想要映射到的数据,最好的方法是使用与数据和序列化器匹配的单独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;
}