使用JSON.net和C#进行序列化时,将JSON属性转换为数字

本文关键字:JSON 属性 数字 转换 序列化 net 使用 | 更新日期: 2023-09-27 17:57:40

我想用JSON输出以下示例数据:

{"source_id":"1234","contacts":["15":"020 8111 1111"]}

我尝试使用Json.net使用以下代码来实现这一点:

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace Test.Utility
{
    public class RequestHelper
    {
        internal static string CreateData(string sourceId, string telephone)
        {
            JArray createContact = new ContactFieldHelper
            {
                Phone = new JValue(telephone)
            };
            var createData = new DataFieldHelper
            {
                SourceId = sourceId,
                CreateContact = createContact
            };
            string output = JsonConvert.SerializeObject(createData);
            return output;
        }
    }
    class DataFieldHelper
    {
        [JsonProperty(PropertyName = "source_id")]
        public string SourceId { get; set; }
        [JsonProperty(PropertyName = "contacts")]
        public JArray CreateContact { get; set; }
    }
    public class ContactFieldHelper : JArray
    {
        [JsonProperty(PropertyName = "15")]
        public JValue Phone { get; set; }
    }
}

但是,这将显示"联系人"字段的空白输出。如果只使用值,但当JArray中有键值对时,它就可以工作。例如,将输出以下内容:

{"source_id":"1234","contacts":["020 8111 1111"]}

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace Test.Utility
{
    public class RequestHelper
    {
        internal static string CreateData(string sourceId, string telephone)
        {
            JArray createContact = new JArray
                                    {
                                        new JValue(telephone)
                                    };
            var createData = new DataFieldHelper
            {
                SourceId = sourceId,
                CreateContact = createContact
            };
            string output = JsonConvert.SerializeObject(createData);
            return output;
        }
    }
    class DataFieldHelper
    {
        [JsonProperty(PropertyName = "source_id")]
        public string SourceId { get; set; }
        [JsonProperty(PropertyName = "contacts")]
        public JArray CreateContact { get; set; }
    }
}

有什么想法吗?

使用JSON.net和C#进行序列化时,将JSON属性转换为数字

根据我的个人建议,实现目标的简单方法是:

创建您的json字符串(注意每个参数、数组、名称等)(请查看此处的json示例,并查看此处以验证json(因为它是wwrite,所以无效)json验证器

转到这里http://json2csharp.com/并用这个工具在简单的类中转换json

将新类导入到项目中,然后使用类System.Web.Script.Serialization.Javascriptserializer 在几行中进行序列化和反序列化

它将更加简单快捷。

在您的代码示例中:

{"source_id":"1234","contacts":["15":"020 8111 1111"]}(invalid json it gives error on validation )

派生类:

 public class Contact
{
   public string __invalid_name__15 { get; set; }
}
public class RootObject
{
  public string source_id { get; set; }
  public List<Contact> contacts { get; set; }
}

如果您愿意,您可以用serializable属性修饰您的属性或整个类,然后只需像这里一样使用javascriptserializar

protected void SerializeItem(string s){
System.Web.Script.Serialization.JavaScriptSerializer js = new System.Web.Script.Serialization.JavaScriptSerializer();
RootObject rt = js.Deserialize<RootObject>(s);//deserialization from string to object
 string S = js.Serialize(RootObject);//serialization from object to complex json string
}

为了更干净,我对你的json代码和这里派生的类做了一点更改

public class Contact
{
public string id { get; set; }
public string phone { get; set; }
 }
 public class RootObject
{
public string sourceid { get; set; }
public List<Contact> contacts { get; set; }
}

这里重新访问json,例如:

    {"sourceid": "1234",
        "contacts": [
                      {
                        "id": "15",
                        "phone":"020 8111 1111"
                       }
                     ]
     }