如何将 json 对象反序列化为 class
How to deserialize json object into class
我有以下 json 字符串:
private const string Json = @"{
'responseMessage': '',
'response': 'PASS',
'responseData': {
'user': {
'initials': 'XXX',
'name': 'XXXX XXXX',
'companies': [
'0002',
'0007',
'0022',
'0033',
'9999'
],
'employee': 'XXXX'
}
},
'responseFor': 'myCommand'
}'";
我的服务器响应 class 看起来像这样:
[JsonObject(MemberSerialization.OptIn)]
public class ServerResponse
{
[JsonProperty("responseFor")]
public string ResponseFor { get; set; }
[JsonProperty("responseData")]
public string ResponseData { get; set; }
[JsonProperty("response")]
public string Response { get; set; }
[JsonProperty("responseMessage")]
public string ResponseMessage { get; set; }
}
我调用这个命令:
var serverResponse = JsonConvert.DeserializeObject<ServerResponse>(Json);
我希望这会填充我的 serverResponse 对象,但我得到了这个异常:
{Newtonsoft.Json.JsonReaderException: Error reading string. Unexpected token: StartObject. Path 'responseData', line 4, position 30.
at Newtonsoft.Json.JsonReader.ReadAsStringInternal () [0x00000] in <filename unknown>:0
at Newtonsoft.Json.JsonTextReader.ReadAsString () [0x00000] in <filename unknown>:0
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.ReadForType (Newtonsoft.Json.JsonReader reader, Newtonsoft.Json.Serialization.JsonContract contract, Boolean hasConverter) [0x00000] in <filename unknown>:0
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateObject (System.Object newObject, Newtonsoft.Json.JsonReader reader, Newtonsoft.Json.Serialization.JsonObjectContract contract, Newtonsoft.Json.Serialization.JsonProperty member, System.String id) [0x00000] in <filename unknown>:0 }
我哪里做错了??
您需要一个 class 作为 ResponseData 以便序列化工作,因为它在您的 json 中的值不是字符串。您还需要一个用户。
创建响应数据和用户 classes,看起来像这样。
[JsonObject(MemberSerialization.OptIn)]
public class User
{
[JsonProperty("initials")]
public string Initials { get; set; }
[JsonProperty("name")]
public string Name { get; set; }
[JsonProperty("companies")]
public string[] Companies { get; set; }
[JsonProperty("responseMessage")]
public string ResponseMessage { get; set; }
}
[JsonObject(MemberSerialization.OptIn)]
public class ResponseData
{
[JsonProperty("user")]
public User User { get; set; }
[JsonProperty("employee")]
public string Employee { get; set; }
}
然后在您的 ServerResponse class 中更改 ResponseData 以使用此 ResponseData class。
我有以下 json 字符串:
private const string Json = @"{
'responseMessage': '',
'response': 'PASS',
'responseData': {
'user': {
'initials': 'XXX',
'name': 'XXXX XXXX',
'companies': [
'0002',
'0007',
'0022',
'0033',
'9999'
],
'employee': 'XXXX'
}
},
'responseFor': 'myCommand'
}'";
我的服务器响应 class 看起来像这样:
[JsonObject(MemberSerialization.OptIn)]
public class ServerResponse
{
[JsonProperty("responseFor")]
public string ResponseFor { get; set; }
[JsonProperty("responseData")]
public string ResponseData { get; set; }
[JsonProperty("response")]
public string Response { get; set; }
[JsonProperty("responseMessage")]
public string ResponseMessage { get; set; }
}
我调用这个命令:
var serverResponse = JsonConvert.DeserializeObject<ServerResponse>(Json);
我希望这会填充我的 serverResponse 对象,但我得到了这个异常:
{Newtonsoft.Json.JsonReaderException: Error reading string. Unexpected token: StartObject. Path 'responseData', line 4, position 30.
at Newtonsoft.Json.JsonReader.ReadAsStringInternal () [0x00000] in <filename unknown>:0
at Newtonsoft.Json.JsonTextReader.ReadAsString () [0x00000] in <filename unknown>:0
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.ReadForType (Newtonsoft.Json.JsonReader reader, Newtonsoft.Json.Serialization.JsonContract contract, Boolean hasConverter) [0x00000] in <filename unknown>:0
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateObject (System.Object newObject, Newtonsoft.Json.JsonReader reader, Newtonsoft.Json.Serialization.JsonObjectContract contract, Newtonsoft.Json.Serialization.JsonProperty member, System.String id) [0x00000] in <filename unknown>:0 }
我哪里做错了??
您需要一个 class 作为 ResponseData 以便序列化工作,因为它在您的 json 中的值不是字符串。您还需要一个用户。
创建响应数据和用户 classes,看起来像这样。
[JsonObject(MemberSerialization.OptIn)]
public class User
{
[JsonProperty("initials")]
public string Initials { get; set; }
[JsonProperty("name")]
public string Name { get; set; }
[JsonProperty("companies")]
public string[] Companies { get; set; }
[JsonProperty("responseMessage")]
public string ResponseMessage { get; set; }
}
[JsonObject(MemberSerialization.OptIn)]
public class ResponseData
{
[JsonProperty("user")]
public User User { get; set; }
[JsonProperty("employee")]
public string Employee { get; set; }
}
然后在您的 ServerResponse class 中更改 ResponseData 以使用此 ResponseData class。