无法将json字符串反序列化为C#类

时间:2019-04-26 15:01:48

标签: c# json.net deserialization

我有一个从api端点返回的json字符串,正在尝试将其反序列化为c#类。反序列化过程出错了。

传入的json字符串:

{"amount":"3.00","resptext":"Approval","cvvresp":"P","respcode":"000","avsresp":"","merchid":"800000000800","token":"9478837814450119","authcode":"PPS306","respproc":"RPCT","emvTagData":"{\"TVR\":\"0200008000\",\"PIN\":\"None\",\"Signature\":\"true\",\"Mode\":\"Issuer\",\"ARC\":\"Z3\",\"TSI\":\"E800\",\"Application Preferred Name\":\"CREDITO DE VISA\",\"AID\":\"A0000000031010\",\"IAD\":\"06010A03A00000\",\"Entry method\":\"Chip Read\",\"Application Label\":\"VISA CREDIT\"}","retref":"116390139157","respstat":"A","account":"47XXXXXXXXXX0119"}

c#类:

public class AuthCardResponse
    {      
        public string token { get; set; }
        public string expiry { get; set; }
        public string name { get; set; }
        public string batchid { get; set; }
        public string retref { get; set; }
        public string avsresp { get; set; }
        public string respproc { get; set; }
        public string amount { get; set; }
        public string resptext { get; set; }
        public string authcode { get; set; }
        public string respcode { get; set; }
        public string merchid { get; set; }
        public string cvvresp { get; set; }
        public string respstat { get; set; }
        public string account { get; set; }
        public string bintype { get; set; }
        public string entrymode{get;set;}
        public string commcard { get; set; }        
        //public string emvTagData { get; set; }        
        public EmvTagData emvTagData { get; set; }
    }    

    public class EmvTagData
    {
        public string TVR { get; set; }
        public string PIN { get; set; }
        public string Signature { get; set; }
        public string Mode { get; set; }
        public string TSI { get; set; }
        public string AID { get; set; }
        public string ARC { get; set; }
        public string IAD { get; set; }

        [JsonProperty("Entry method")]
        public string Entrymethod { get; set; }

        [JsonProperty("Application Label")]
        public string ApplicationLabel { get; set; }

        [JsonProperty("Application Preferred Name")]
        public string ApplicationPreferredName { get; set; }
    }
}

反序列化代码:

AuthCardResponse _authCardResponse = JsonConvert.DeserializeObject<AuthCardResponse>(authResultJson );

错误:

at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.EnsureType(JsonReader reader, Object value, CultureInfo culture, JsonContract contract, Type targetType)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.SetPropertyValue(JsonProperty property, JsonConverter propertyConverter, JsonContainerContract containerContract, JsonProperty containerProperty, JsonReader reader, Object target)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateObject(Object newObject, JsonReader reader, JsonObjectContract contract, JsonProperty member, String id)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent)
   at Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType)
   at Newtonsoft.Json.JsonConvert.DeserializeObject(String value, Type type, JsonSerializerSettings settings)
   at Newtonsoft.Json.JsonConvert.DeserializeObject[T](String value, JsonSerializerSettings settings)
   at Newtonsoft.Json.JsonConvert.DeserializeObject[T](String value)

我不知道是什么错误。我已经尝试过在线json解析器,并且他们能够解析字符串而没有任何问题。

感谢您的帮助。

谢谢 NH

3 个答案:

答案 0 :(得分:2)

您的emvTagData是一个文字字符串,但是您试图将其反序列化为一个复杂的对象。

"emvTagData":"{\"TVR\":\"0200008000\",\"PIN\":\"None\",\"Signature\":\"true\",\"Mode\":\"Issuer\",\"ARC\":\"Z3\",\"TSI\":\"E800\",\"Application Preferred Name\":\"CREDITO DE VISA\",\"AID\":\"A0000000031010\",\"IAD\":\"06010A03A00000\",\"Entry method\":\"Chip Read\",\"Application Label\":\"VISA CREDIT\"}"

看到您已经在string类中将其作为AuthCardResponse类型的注释得到了,我希望您已经发现可以将其反序列化为string

答案 1 :(得分:0)

您可以使用JSON在线进行Csharp检查C#类

您需要采取更多步骤,才能通过find_package() emvTagData到对象获取结果。

http://json2csharp.com/

enter image description here 使用您的JSON数据,您的类应该是

Deserialize

答案 2 :(得分:0)

您的json对Newtonsoft.Json语法不正确。 您的json中的对象(EmvTagData)应该如下所示:

"emvTagData": {
"TVR": "0200008000",
"PIN": "None",
"Signature": "true",
"Mode": "Issuer",
"ARC": "Z3",
"TSI": "E800",
"Application Preferred Name": "CREDITO DE VISA",
"AID": "A0000000031010",
"IAD": "06010A03A00000",
"Entry method": "Chip Read",
"Application Label": "VISA CREDIT"}

在主括号之前和之后没有\“和”。

整个json:

{"amount":"3.00","resptext":"Approval","cvvresp":"P","respcode":"000","avsresp":"","merchid":"800000000800","token":"9478837814450119","authcode":"PPS306","respproc":"RPCT","emvTagData":{"TVR":"0200008000","PIN":"None","Signature":"true","Mode":"Issuer","ARC":"Z3","TSI":"E800","Application Preferred Name":"CREDITO DE VISA","AID":"A0000000031010","IAD":"06010A03A00000","Entry method":"Chip Read","Application Label":"VISA CREDIT"},"retref":"116390139157","respstat":"A","account":"47XXXXXXXXXX0119"}