C# JSON数组中包含特定数据的服务堆栈响应DTO
我正在为返回JSON数据的服务建模响应DTO,如下所示:C# JSON数组中包含特定数据的服务堆栈响应DTO,c#,
servicestack,dto,C#,
servicestack,Dto,我正在为返回JSON数据的服务建模响应DTO,如下所示: { "response": { "metadataA" : "useless info a", "metadataB" : "useless info b", "metadataC" : "useless info c", ... "metadataZ" : "useless info z", "results" :
{
"response":
{
"metadataA" : "useless info a",
"metadataB" : "useless info b",
"metadataC" : "useless info c",
...
"metadataZ" : "useless info z",
"results" :
[
{
"resultmetadataA" : "useless info a",
"resultmetadataB" : "useless info b",
"resultId": "a",
"resultName": "A"
},
{
"resultmetadataA" : "useless info a",
"resultmetadataB" : "useless info b",
"resultId": "b",
"resultName": "B"
}
]
}
}
class Response
{
public List<Result> Results { get; set; }
}
class Result
{
public string Id { get; set; }
public string Name { get; set; }
}
显然,我只希望我的DTO有一个带有ID和名称的结果列表,如下所示:
{
"response":
{
"metadataA" : "useless info a",
"metadataB" : "useless info b",
"metadataC" : "useless info c",
...
"metadataZ" : "useless info z",
"results" :
[
{
"resultmetadataA" : "useless info a",
"resultmetadataB" : "useless info b",
"resultId": "a",
"resultName": "A"
},
{
"resultmetadataA" : "useless info a",
"resultmetadataB" : "useless info b",
"resultId": "b",
"resultName": "B"
}
]
}
}
class Response
{
public List<Result> Results { get; set; }
}
class Result
{
public string Id { get; set; }
public string Name { get; set; }
}
类响应
{
公共列表结果{get;set;}
}
班级成绩
{
公共字符串Id{get;set;}
公共字符串名称{get;set;}
}
是否有一些属性告诉服务堆栈id和名称值的“路径”
编辑1 我正在尝试使用ServiceStack.DataAnnotations中的一些属性,但运气不好。 试图在
结果中使用(false,“response”,“results”),在结果属性中使用,但结果始终为空
救命啊
编辑2
还尝试了[DataContract]
作为响应,并在属性上[DataMember(Name=Id/Name)]
直接解析这些数据,但似乎不起作用。您可以使用字典:
public class ResponseDTO
{
public List<Dictionary<string, string>> Results { get; set; }
}
公共类响应到
{
公共列表结果{get;set;}
}
您可以使用字典:
public class ResponseDTO
{
public List<Dictionary<string, string>> Results { get; set; }
}
公共类响应到
{
公共列表结果{get;set;}
}
以JSON开头是无效的“响应”:[
不能是数组文字,但包含对象属性
如何调试序列化问题
目标是让您的模式匹配JSON的形状。不要尝试猜测形状应该是什么,养成推断形状的习惯,尝试看看哪些属性被序列化。如果没有属性被序列化,则反向填充并序列化您的POCO,以查看它们应该是什么形状,然后比较将形状更改为原始JSON,以查看它们的不同之处。请参阅
从上述JSON推断出的类型:
public class MetadataResponse
{
public Response Response { get; set; }
}
public class Response
{
public string MetadataA { get; set; }
public string MetadataB { get; set; }
public string MetadataC { get; set; }
public string MetadataZ { get; set; }
public List<Result> Results { get; set; }
}
public class Result
{
public string ResultmetadataA { get; set; }
public string ResultmetadataB { get; set; }
public string ResultId { get; set; }
public string ResultName { get; set; }
}
从JSON开始是无效的“响应”:[
不能是数组文字,但包含对象属性
如何调试序列化问题
目标是让您的模式匹配JSON的形状。不要尝试猜测形状应该是什么,养成推断形状的习惯,尝试看看哪些属性被序列化。如果没有属性被序列化,则反向填充并序列化您的POCO,以查看它们应该是什么形状,然后比较将形状更改为原始JSON,以查看它们的不同之处。请参阅
从上述JSON推断出的类型:
public class MetadataResponse
{
public Response Response { get; set; }
}
public class Response
{
public string MetadataA { get; set; }
public string MetadataB { get; set; }
public string MetadataC { get; set; }
public string MetadataZ { get; set; }
public List<Result> Results { get; set; }
}
public class Result
{
public string ResultmetadataA { get; set; }
public string ResultmetadataB { get; set; }
public string ResultId { get; set; }
public string ResultName { get; set; }
}
毕竟,我还没有找到为复杂响应建立简单DTO模型的方法,无论如何,感谢所有答案
很遗憾,我的POCO结构依赖于JSON响应结构。但是,我可以抽象响应结构,让我所有的DTO同时处理它
考虑到我的问题中类似的JSON结构:
{
"response":
{
...,
"results":
[
{
"resourceType": "letter" ,
"resources": ["a", "b", "c", ...]
},
{
"resourceType": "number" ,
"resources": ["1", "2", "3", ...]
},
...
]
}
}
我提取了公共响应结构:
enum ResourceKind
{
Letter,
Number
}
public class BaseResponse
{
public ResponseContent Response
{
get;
set;
}
}
public class ResponseContent
{
public List<ResultContent> Results
{
get;
set;
}
}
public class ResultContent
{
public ResourceKind Kind
{
get;
set;
}
public List<string> Resources
{
get;
set;
}
}
enum ResourceKind
{
信,
数
}
公共类基类响应
{
公众反应
{
得到;
设置
}
}
公共类响应内容
{
公开名单结果
{
得到;
设置
}
}
公共类结果内容
{
公共资源种类
{
得到;
设置
}
公共列表资源
{
得到;
设置
}
}
最终得到了一个(几十个)特定服务器响应的简化实现:
public class SpecificResponse : BaseResponse
{
public IEnumerable<SpecificResult> Results
{
get
{
foreach(ResultContent result in Response.Results)
{
SpecificResult newSpecificResult = new SpecificResult();
newSpecificResult.Kind = result.Kind;
newSpecificResult.Resources = result.Resources;
yield return newCategory;
}
yield break;
}
}
}
public类特定响应:BaseResponse
{
可数结果
{
得到
{
foreach(ResultContent result in Response.Results)
{
SpecificResult newSpecificResult=新SpecificResult();
newSpecificResult.Kind=结果.Kind;
newSpecificResult.Resources=result.Resources;
新类别收益率;
}
屈服断裂;
}
}
}
我仍在寻找更好的解决方案,但目前这是我的解决方案。毕竟,我还没有找到为复杂响应建立简单DTO模型的方法,无论如何,感谢所有答案
很遗憾,我的POCO结构依赖于JSON响应结构。但是,我可以抽象响应结构,让我所有的DTO同时处理它
考虑到我的问题中类似的JSON结构:
{
"response":
{
...,
"results":
[
{
"resourceType": "letter" ,
"resources": ["a", "b", "c", ...]
},
{
"resourceType": "number" ,
"resources": ["1", "2", "3", ...]
},
...
]
}
}
我提取了公共响应结构:
enum ResourceKind
{
Letter,
Number
}
public class BaseResponse
{
public ResponseContent Response
{
get;
set;
}
}
public class ResponseContent
{
public List<ResultContent> Results
{
get;
set;
}
}
public class ResultContent
{
public ResourceKind Kind
{
get;
set;
}
public List<string> Resources
{
get;
set;
}
}
enum ResourceKind
{
信,
数
}
公共类基类响应
{
公众反应
{
得到;
设置
}
}
公共类响应内容
{
公开名单结果
{
得到;
设置
}
}
公共类结果内容
{
公共资源种类
{
得到;
设置
}
公共列表资源
{
得到;
设置
}
}
最终得到了一个(几十个)特定服务器响应的简化实现:
public class SpecificResponse : BaseResponse
{
public IEnumerable<SpecificResult> Results
{
get
{
foreach(ResultContent result in Response.Results)
{
SpecificResult newSpecificResult = new SpecificResult();
newSpecificResult.Kind = result.Kind;
newSpecificResult.Resources = result.Resources;
yield return newCategory;
}
yield break;
}
}
}
public类特定响应:BaseResponse
{
可数结果
{
得到
{
foreach(ResultContent result in Response.Results)
{
SpecificResult newSpecificResult=新SpecificResult();
newSpecificResult.Kind=结果.Kind;
newSpecificResult.Resources=result.Resources;
新类别收益率;
}
屈服断裂;
}
}
}
我仍然在寻找更好的东西,但现在这是我的解决方案。真的很好!但是没有办法得到更强类型的东西?!使用您的方法,我能够在“响应”中获得字符串对,但是当将属性名称从Response
更改为Results
时,我得到了一个空字典。我不知道将属性名称从Response
重命名为Results
与此问题有何关系。如果使用Results
您将得到结果:[……]
如果您使用响应