繁体   English   中英

C#JSON匿名序列化

[英]C# JSON anonymous serialization

我正在尝试为API调用序列化一些JSON:

string f5Name = "MyBigIpName";
string poolName = "myPoolName";
string postJson2 = JsonConvert.SerializeObject(
    new
    {
        f5 = new {
            f5Name = new {
                poolName = memberState
            },
        }
    }
);

这将导致以下JSON:

{
    "f5": {
        "f5Name": {
            "poolName": {
                "member": {
                    "address": "10.0.0.0",
                    "port": 80
                },
                "session_state": "STATE_DISABLED"
            }
        }
    }
}

但是,我真正想要做的是生成此JSON:

{
    "f5": {
        "MyBigIpName": {
            "myPoolName": {
                "member": {
                    "address": "10.0.0.0",
                    "port": 80
                },
                "session_state": "STATE_DISABLED"
            }
        }
    }
}

有什么方法可以使f5Name和poolName属性名称动态化,以便产生上述JSON? 我正在使用Newtonsoft.JSON(JSON.NET)

我不确定是否可以使用dynamic类型执行某些操作,但是您可以肯定地可以使用Dictionary执行某些操作:

var obj = new
{
    f5 = new Dictionary<string, object>
    {
        {
            f5Name, new Dictionary<string, object> {
                {poolName, memberState}
            }
        }
    }
}
string postJson2 = JsonConvert.SerializeObject(obj);

对于您想要的内容,您需要在合同解析器中解析您的姓名。 就像是:

private class MyContractResolver : DefaultContractResolver
{
  private Dictionary<string,string> _translate;
  public MyContractResolver(Dictionary<string, string> translate)
  {
    _translate = translate;
  }
  protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
  {
    var property = base.CreateProperty(member, memberSerialization);
    string newPropertyName;
    if(_translate.TryGetValue(property.PropertyName, out newPropertyName))
      property.PropertyName = newPropertyName;
    return property;
  }
}

接着:

string f5Name = "MyBigIpName";
string poolName = "MyPoolName";     
var _translator = new Dictionary<string, string>()
{
  { "f5Name", f5Name },
  { "poolName", poolName },
};
string postJson2 = JsonConvert.SerializeObject(
    new
    {
      f5 = new {
        f5Name = new {
            poolName = memberState
        },
    },
    new JsonSerializerSettings { ContractResolver = new MyContractResolver(_translator) });

如果使用C#6,则可以受益于nameof和/或通过字典初始化器使其更nameof

var _translator = new Dictionary<string, string>()
{
  [nameof(f5Name)] = f5Name ,
  [nameof(poolName)] = poolName ,
};

字典创建过程也可以很容易地实现自动化:-)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM