Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# JSON数组中包含特定数据的服务堆栈响应DTO_C#_<img Src="//i.stack.imgur.com/WM7S8.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">servicestack_Dto - Fatal编程技术网 servicestack,dto,C#,servicestack,Dto" /> servicestack,dto,C#,servicestack,Dto" />

C# 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" :

我正在为返回JSON数据的服务建模响应DTO,如下所示:

{
    "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
您将得到
结果:[……]
如果您使用
响应