Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.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# 使用JavaScriptSerializer将实体映射到JSON_C#_Jquery_.net_Asp.net_Json - Fatal编程技术网

C# 使用JavaScriptSerializer将实体映射到JSON

C# 使用JavaScriptSerializer将实体映射到JSON,c#,jquery,.net,asp.net,json,C#,Jquery,.net,Asp.net,Json,我的实体是这样的: class Address { public string Number { get; set; } public string Street { get; set; } public string City { get; set; } public string Country { get; set; } } class Person { public string Name { get; set; } publ

我的实体是这样的:

class Address
{
     public string Number { get; set; }
     public string Street { get; set; }
     public string City { get; set; }
     public string Country { get; set; }
}

class Person
{
     public string Name { get; set; }
     public int Age { get; set; }
     public Address PostalAddress { get; set; }
}

Person newPerson = 
    new Person()
    {
       Name = "Kushan",
       Age = 25,
       PostalAddress = 
           new Address()
           {
               Number = "No 25",
               Street = "Main Street",
               City = "Matale",
               Country = "Sri Lanka"
           }
    };
现在我想把这个newPerson对象映射成这样的JSON对象

{ 
     "PER_NAME" : "Kushan",
     "PER_AGE" : "25",
     "PER_ADDRESS" : {
                          "ADD_NUMBER" : "No 25",
                          "ADD_STREET" : "Main Street",
                          "ADD_CITY" : "Matale",
                          "ADD_COUNTRY" : "Sri Lanka"
                     }
}
注:以上只是一个例子

我需要的是,我需要在序列化时自定义密钥。默认情况下,它将属性名称作为键。我不能更改属性名称。如何做到这一点


另外,是否可以更改JSON obj中键值对的显示顺序?

您需要将
DataContract
属性添加到类中,并将
DataMember
添加到属性中。将
DataMemeber
属性的
Name
属性设置为自定义属性名称,并将
Order
属性设置为定义顺序

[DataContract]
public class Person
{
    [DataMember(Name = "PER_NAME", Order = 1)]
    public string Name { get; set; }

    [DataMember(Name = "PER_AGE", Order = 2)]
    public int Age { get; set; }

    [DataMember(Name = "PER_ADDRESS", Order = 3)]
    public Address PostalAddress { get; set; }
}
然后你可以这样做:

var newPerson = new Person()
{
    Name = "Kushan",
    Age = 25,
    PostalAddress = new Address()
    {
        Number = "No 25",
        Street = "Main Street",
        City = "Matale",
        Country = "Sri Lanka"
    }
};

MemoryStream stream = new MemoryStream();
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(Person));
ser.WriteObject(stream, newPerson);
要检查结果,请执行以下操作:

var result = Encoding.ASCII.GetString(stream.ToArray());

{"PER_NAME":"Kushan","PER_AGE":25,"PER_ADDRESS":{"ADD_NUMBER":"No 25","ADD_STREET":"Main Street","ADD_CITY":"Matale","ADD_COUNTRY":"Sri Lanka"}}

可以使用JavaScriptSerializer序列化匿名类型,因此可以尝试将对象投影到要序列化的形状中:

person.Select(s => new { PER_NAME = s.Name, PER_AGE = s.Age });

谢谢吉布森。。但是Alex的ans是最清楚的。。我接受了……)@AlexAza如果我想将
{“年龄”:25,“姓名”:“Kushan”,“邮资”:{“城市”:“Matale”,“国家”:“斯里兰卡”,“号码”:“25号”,“街道”:“大街”}}
映射到类中,那么这个问题需要JavaScriptSerializer,而不是DataContractJsonSerializer。我相信你的回答是误导性的,没有提供任何关于JavaScriptSerializer的相关信息。