【问题标题】:When I try to use Jsonserialize in newtonsoft.json, return null to the string当我尝试在 newtonsoft.json 中使用 Jsonserialize 时,将 null 返回到字符串
【发布时间】:2016-05-18 04:26:03
【问题描述】:

就像我说的,我无法使用 JsonConvert.SerializeObject(b) 将字符串作为返回值。

这就是我正在尝试的:

        BankAccount b = new BankAccount();
        b.Agencia = "0192";
        b.AgenciaDv = "0";
        b.Conta = "03245";
        b.ContaDv = "0";
        b.BankCode = "0341";
        b.DocumentNumber = "26268738888";
        b.LegalName = "API BANK ACCOUNT";
        b.Save();

        string json = JsonConvert.SerializeObject(b);

字符串 json 必须接收 json 对象,对吧?如何获取bankaccount b对象的json对象?

编辑: 我没有任何例外。 BankAccount 是参考库中的一个类。

    using System;
using Newtonsoft.Json;

namespace PagarMe
{
    public class BankAccount : Base.Model
    {
        protected override string Endpoint { get { return "/bank_accounts"; } }

        public string BankCode
        {
            get { return GetAttribute<string>("bank_code"); }
            set { SetAttribute("bank_code", value); }
        }

        public string Agencia
        {
            get { return GetAttribute<string>("agencia"); }
            set { SetAttribute("agencia", value); }
        }

        public string AgenciaDv
        {
            get { return GetAttribute<string>("agencia_dv"); }
            set { SetAttribute("agencia_dv", value); }
        }

        public string Conta
        {
            get { return GetAttribute<string>("conta"); }
            set { SetAttribute("conta", value); }
        }

        public string ContaDv
        {
            get { return GetAttribute<string>("conta_dv"); }
            set { SetAttribute("conta_dv", value); }
        }

        public DocumentType DocumentType
        {
            get { return GetAttribute<DocumentType>("document_type"); }
            set { SetAttribute("document_type", value); }
        }

        public string DocumentNumber
        {
            get { return GetAttribute<string>("document_number"); }
            set { SetAttribute("document_number", value); }
        }

        public string LegalName
        {
            get { return GetAttribute<string>("legal_name"); }
            set { SetAttribute("legal_name", value); }
        }

        public bool ChargeTransferFees
        {
            get { return GetAttribute<bool>("charge_transfer_fees"); }
            set { SetAttribute("charge_transfer_fees", value); }
        }

        public BankAccount()
            : this(null)
        {

        }

    public BankAccount(PagarMeService service)
            : base(service)
        {
        }
    }

我得到的“json”变量的结果是“{}”。 我需要获取一个 json 对象来发出发布请求。我能做什么?

编辑²: getAttribute:网络框架的标准方法。 检索元素上命名属性的值。

SetAttribute:网络框架的标准方法。 设置元素上命名属性的值。

基础模型:

public abstract class Model : AbstractModel
{
    public string Id
    {
        get
        {
            var result = GetAttribute<object>("id");

            if (result == null)
                return null;

            return result.ToString();
        }
        set { SetAttribute("id", value); }
    }
public DateTime? DateCreated
{
    get
    {
        var result = GetAttribute<DateTime?>("date_created");
        if (result == null)
            return null;
        return result;
    }
}
public DateTime? DateUpdated
{
    get
    {
        var result = GetAttribute<DateTime?>("date_updated");
        if (result == null)
            return null;
        return result;
    }
}

    private Model()
        : this(null)
    {
    }

    protected Model(PagarMeService service)
        : base(service)
    {
    }

    public void ExecuteSelfRequest(PagarMeRequest request)
    {
        LoadFrom(request.Execute().Body);
    }

    public async Task ExecuteSelfRequestAsync(PagarMeRequest request)
    {
        LoadFrom((await request.ExecuteAsync()).Body);
    }

    public void Refresh()
    {
        Refresh(Id);
    }

    internal void Refresh(string id)
    {
        if (id == null)
            throw new InvalidOperationException("Cannot refresh not existing object.");

        var request = CreateCollectionRequest("GET", "/" + id);
        var response = request.Execute();

        LoadFrom(response.Body);
    }

    #if HAS_ASYNC
    public async Task RefreshAsync()
    {
        await RefreshAsync(Id);
    }

    internal async Task RefreshAsync(string id)
    {
        if (id == null)
            throw new InvalidOperationException("Cannot refresh not existing object.");

        var request = CreateCollectionRequest("GET", "/" + id);
        var response = await request.ExecuteAsync();

        LoadFrom(response.Body);
    }
    #endif

    public void Save()
    {
        if (Id == null)
        {
            var request = CreateCollectionRequest("POST");

            request.Body = ToJson(SerializationType.Full);

            var response = request.Execute();

            LoadFrom(response.Body);
        }
        else
        {
            var request = CreateRequest("PUT");

            request.Body = ToJson(SerializationType.Shallow);

            var response = request.Execute();

            LoadFrom(response.Body);
        }
    }

    #if HAS_ASYNC
    public async Task SaveAsync()
    {
        if (Id == null)
        {
            var request = CreateCollectionRequest("POST");

            request.Body = ToJson(SerializationType.Full);

            var response = await request.ExecuteAsync();

            LoadFrom(response.Body);
        }
        else
        {
            var request = CreateRequest("PUT");

            request.Body = ToJson(SerializationType.Shallow);

            var response = await request.ExecuteAsync();

            LoadFrom(response.Body);
        }
    }
    #endif

    protected PagarMeRequest CreateRequest(string method, string endpoint = "")
    {
        return new PagarMeRequest(Service, method, Endpoint + "/" + Id + endpoint);
    }

    protected PagarMeRequest CreateCollectionRequest(string method, string endpoint = "")
    {
        return new PagarMeRequest(Service, method, Endpoint + endpoint);
    }

    internal void SetId(string id)
    {
        Id = id;
    }

    protected virtual bool CanSave()
    {
        return true;
    }

    protected abstract string Endpoint { get; }
}

认为错误类似于配置。 Newtonsoft.Json 需要在模型类中具体配置字段的声明吗?

【问题讨论】:

  • 好像没什么问题,你得到了什么意想不到的结果?
  • 您的代码看起来不错。您是否在任何地方遇到任何异常?
  • @Ian OP 在json 变量中得到null
  • 你的代码没有问题。 dotnetfiddle.net/JBclzp
  • GetAttribute 和 SetAttribute 是做什么的? Base.Model 中有什么?还有很多缺失的代码。

标签: c# json serialization json.net


【解决方案1】:

我发现了问题。 BankAccount 类在另一个解决方案中。引用了DLL,但是newtonsoft.json不能这样序列化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-29
    • 2018-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-23
    相关资源
    最近更新 更多