Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/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对象反序列化为带有;“动态”;财产_C#_Json_Serialization_Json.net - Fatal编程技术网

C# 将JSON对象反序列化为带有;“动态”;财产

C# 将JSON对象反序列化为带有;“动态”;财产,c#,json,serialization,json.net,C#,Json,Serialization,Json.net,我正在接收与以下类匹配的JSON消息: public class Response { public int Code { get; } public string Message { get; } public string Result { get; } } 但是Result属性的值取决于我们在code中得到的内容,并且没有固定的结构 例如,如果code=1,结果将返回类型为X的对象列表,如果code=2,结果将返回类型为Y的对象列表 当我尝试反序列化接收到的消息时

我正在接收与以下类匹配的JSON消息:

public class Response
{
    public int Code { get; }
    public string Message { get; }
    public string Result { get; }
}
但是
Result
属性的值取决于我们在
code
中得到的内容,并且没有固定的结构

例如,如果
code=1
,结果将返回类型为X的对象列表,如果
code=2
,结果将返回类型为Y的对象列表

当我尝试反序列化接收到的消息时,将结果类型设置为
string
似乎不起作用

var responseObj = JsonConvert.DeserializeObject<Response>(response);
if (responseObj.Code == 1)
{
    return responseObj.Result;
}
var responseObj=JsonConvert.DeserializeObject(响应);
if(responseObj.Code==1)
{
返回响应bj.Result;
}
上面的return语句引发以下异常:

分析值时遇到意外字符:[.Path'Result'

我如何定义我的类,以便它接收结果的整个文本,并在以后决定对其进行反序列化?因为我的所有请求都以上述结构响应,并且我希望管理来自同一位置的所有这些请求

我如何定义我的类,以便它接收结果的整个文本,并在以后决定对其进行反序列化

如果您希望这样做,则将
结果
属性设置为一个属性,而不是
字符串
,如下所示。您还需要将setter添加到
响应
类中显示的所有属性中,以允许反序列化正常工作:无法反序列化为只读属性

public class Response
{
    public int Code { get; set; }
    public string Message { get; set; }
    public JToken Result { get; set; }
}
一旦您知道应将
结果
转换为什么类型,就可以使用该方法进行转换。例如:

Response responseObj = JsonConvert.DeserializeObject<Response>(response);

if (responseObj.Code == 1)
{
    var listOfX = responseObj.Result.ToObject<List<X>>();
    ...
}
Response-responseObj=JsonConvert.DeserializeObject(响应);
if(responseObj.Code==1)
{
var listOfX=responseObj.Result.ToObject();
...
}

Fiddle:

结果属性是
列表
,不是字符串听起来可能你的数据是数组,不是对象或字符串。你不能将数组反序列化为字符串。你需要某种列表。你能给我们看看JSON吗?@Fabjan true。但是我怎么能得到该对象的字符串表示?你为什么想要字符串表示表示它??您可以使用
动态
列表
。您不能期望只反序列化JSON的一部分-它被视为一个连贯的单元。更好的做法是告诉您的代码反序列化到什么类型。根据您对API的请求,您有没有办法知道您正在使用什么类型的列表要回去吗?实际上API响应应该是确定性的-您应该确切地知道根据您输入的内容将要取出的数据的格式。如果它根据一些内部逻辑而变化,那么这是一个糟糕的设计IMHO,正是因为它会导致这样的问题。