Json DeserializeObject返回null - 我做错了什么?

时间:2016-02-05 00:03:18

标签: c# json

以下是对DeserializeObject的调用:

listrootobject obj = JsonConvert.DeserializeObject<listrootobject>(json);

这是Json。

{
    "so:MemberProfileDataSet": {
        "@xmlns:moso": "http://schema.socloud.com/1/MemberProfileDataSet.xsd",
        "Member": {
            "@xmlns": "http://schema.socloud.com/1/MemberProfileDataSet.xsd",
            "PartyId": "63",
            "PartyTypeName": "Employee",
            "RoleId": "1310",
            "BusinessUnitCode": "95",
            "CardId": null,
            "PostalContact": {
                "PartyId": "63",
                "TypeName": "Mailing Address",
                "Address1": "100 Main Ave",
                "Address2": null,
                "Address3": null,
                "City": "Arlington",
                "State": "VA",
                "PostalCode": "22206"
            },
            "PhoneContact": [{
                "PartyId": "63",
                "TypeName": "Cell",
                "CountryCode": "1",
                "Telephone": "(555) 555-5555",
                "AdditionalData": null,
                "TextMessageOK": "false"
            }, {
                "PartyId": "63",
                "TypeName": "Home",
                "CountryCode": "1",
                "Telephone": null,
                "AdditionalData": null,
                "TextMessageOK": "false"
            }],
            "Property": [{
                "PartyId": "63",
                "Name": "First Name",
                "Value": "Katie"
            }, {
                "PartyId": "63",
                "Name": "Last Name",
                "Value": "Rodriguez"
            }, {
                "PartyId": "63",
                "Name": "Payroll ID",
                "Value": null
            }, {
                "PartyId": "63",
                "Name": "Lookup Initials",
                "Value": null
            }, {
                "PartyId": "63",
                "Name": "Date of Birth",
                "Value": null
            }, {
                "PartyId": "63",
                "Name": "Hire Date",
                "Value": null
            }, {
                "PartyId": "63",
                "Name": "Termination Date",
                "Value": null
            }, {
                "PartyId": "63",
                "Name": "Gender",
                "Value": null
            }]
        }
    }
}

这是C#Class

public class PostalContact
{
    public string PartyId { get; set; }
    public string TypeName { get; set; }
    public string Address1 { get; set; }
    public string Address2 { get; set; }
    public string Address3 { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public string PostalCode { get; set; }
}

public class EmailContact
{
    public string PartyId { get; set; }
    public string TypeName { get; set; }
    public string EmailAddress { get; set; }
    public string EmailOptOut { get; set; }
}

public class PhoneContact
{
    public string PartyId { get; set; }
    public string TypeName { get; set; }
    public string CountryCode { get; set; }
    public string Telephone { get; set; }
    public string AdditionalData { get; set; }
    public string TextMessageOK { get; set; }
}

public class Property
{
    public string PartyId { get; set; }
    public string Name { get; set; }
    public string Value { get; set; }
}

//public class rootobject
//{
//    public List<Member> Members { get; set; }
//}
public class Member
{
    public string PartyId { get; set; }
    public string PartyTypeName { get; set; }
    public string RoleId { get; set; }
    public string BusinessUnitCode { get; set; }
    public string CardId { get; set; }
    public PostalContact PostalContact { get; set; }
    public EmailContact EmailContact { get; set; }
    public List<PhoneContact> PhoneContact { get; set; }
    public List<Property> Property { get; set; }
    public string _xmlns { get; set; }
}

public class MemberProfileDataSet
{
    public Member Member { get; set; }
    public string __invalid_name___xmlns_moso { get; set; }
    public string __prefix { get; set; }
}


public class listrootobject
{
    public List<MemberProfileDataSet> rootobjects { get; set; }
}
public class rootobject
{
    public MemberProfileDataSet MemberProfileDataSet { get; set; }
}

1 个答案:

答案 0 :(得分:3)

使用http://json2csharp.com/生成并编写C#类作为网站生成的类。最后,您将解析rootObject,如下所示。

但是您遇到了问题,因为它在C#中生成的属性名称无效,您无法使用这些名称创建C#类。但名称必须匹配才能反序列化。因此,您需要删除无效字符或重命名它们以满足C#CLR命名要求。然后创建正确格式化字符串的C#类。之后你可以反序列化。

例如,我从原始字符串生成了C#对象,我的属性名称为
public SoMemberProfileDataSet __invalid_name__so:MemberProfileDataSet { get; set; }

这在C#中无效,但您需要在字符串中将其格式化为有效的内容,例如

public SoMemberProfileDataSet MemberProfileDataSet { get; set; }

通过重命名json字符串或从字符串中获取所需的属性并在反序列化之前正确地重构json。

告诉我代码

作为一个例子,我在冒号之间组合了字符串并删除了@符号,这样我就创建了一个有效的C#对象。并且它取消了。请参阅下面的json字符串中的更改。所以请格式化你的json字符串,你就可以了。

string json = "{\"soMemberProfileDataSet\": {\"xmlnsmoso\": \"http://schema.socloud.com/1/MemberProfileDataSet.xsd\",\"Member\": {\"xmlns\": \"http://schema.socloud.com/1/MemberProfileDataSet.xsd\",\"PartyId\": \"63\",\"PartyTypeName\": \"Employee\",\"RoleId\": \"1310\",\"BusinessUnitCode\": \"95\",\"CardId\": null,\"PostalContact\": {\"PartyId\": \"63\",\"TypeName\": \"Mailing Address\",\"Address1\": \"100 Main Ave\",\"Address2\": null,\"Address3\": null,\"City\": \"Arlington\",\"State\": \"VA\",\"PostalCode\": \"22206\"},\"PhoneContact\": [{\"PartyId\": \"63\",\"TypeName\": \"Cell\",\"CountryCode\": \"1\",\"Telephone\": \"(555) 555-5555\",\"AdditionalData\": null,\"TextMessageOK\": \"false\"}, {\"PartyId\": \"63\",\"TypeName\": \"Home\",\"CountryCode\": \"1\",\"Telephone\": null,\"AdditionalData\": null,\"TextMessageOK\": \"false\"}],\"Property\": [{\"PartyId\": \"63\",\"Name\": \"First Name\",\"Value\": \"Katie\"}, {\"PartyId\": \"63\",\"Name\": \"Last Name\",\"Value\": \"Rodriguez\"}, {\"PartyId\": \"63\",\"Name\": \"Payroll ID\",\"Value\": null}, {\"PartyId\": \"63\",\"Name\": \"Lookup Initials\",\"Value\": null}, {\"PartyId\": \"63\",\"Name\": \"Date of Birth\",\"Value\": null}, {\"PartyId\": \"63\",\"Name\": \"Hire Date\",\"Value\": null}, {\"PartyId\": \"63\",\"Name\": \"Termination Date\",\"Value\": null}, {\"PartyId\": \"63\",\"Name\": \"Gender\",\"Value\": null}]}}}";

        var listrootobject = JsonConvert.DeserializeObject<RootObject>(json);

您的类现在应该如下所示,格式化后不再有无效的属性名称

public class PostalContact
{
    public string PartyId { get; set; }
    public string TypeName { get; set; }
    public string Address1 { get; set; }
    public object Address2 { get; set; }
    public object Address3 { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public string PostalCode { get; set; }
}

public class PhoneContact
{
    public string PartyId { get; set; }
    public string TypeName { get; set; }
    public string CountryCode { get; set; }
    public string Telephone { get; set; }
    public object AdditionalData { get; set; }
    public string TextMessageOK { get; set; }
}

public class Property
{
    public string PartyId { get; set; }
    public string Name { get; set; }
    public string Value { get; set; }
}

public class Member
{
    public string xmlns { get; set; }
    public string PartyId { get; set; }
    public string PartyTypeName { get; set; }
    public string RoleId { get; set; }
    public string BusinessUnitCode { get; set; }
    public object CardId { get; set; }
    public PostalContact PostalContact { get; set; }
    public List<PhoneContact> PhoneContact { get; set; }
    public List<Property> Property { get; set; }
}

public class SoMemberProfileDataSet
{
    public string xmlnsmoso { get; set; }
    public Member Member { get; set; }
}

public class RootObject
{
    public SoMemberProfileDataSet soMemberProfileDataSet { get; set; }
}