C# 将JSON对象反序列化为带有;“动态”;财产
我正在接收与以下类匹配的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的对象列表 当我尝试反序列化接收到的消息时
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,正是因为它会导致这样的问题。