繁体   English   中英

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

[英]Converting simple Json to Complex Object in c#

我的杰森是

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

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

Class Response
{
int Id,
string Name,
ConnectedObject Obj
}

Class ConnectedObject
{
string COName,
int COId
}

有没有办法使用DataContractJsonSerializer实现此目的

大多数序列化程序希望对象和数据共享布局-因此,大多数json序列化程序希望ConnectedObjectNameConnectedObjectId存在于根对象上,而不是内部对象上。 通常,如果数据不适合您要映射到的数据,最好的方法是使用与数据和序列化程序匹配的单独的DTO模型,然后从DTO模型映射到实际模型您需要以编程方式,还是使用自动映射器之类的工具。

如果您使用DTO方法,那么这里几乎任何 JSON解串器都可以。 Json.NET是一个很好的默认设置。 DataContractJsonSerializer会的方式方法我JSONserializers考虑的名单上了。

为了扩展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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM