C#JSON匿名序列化

时间:2016-02-01 18:58:43

标签: c# json serialization json.net

我正在尝试为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)

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

对于您的意图,您需要在合同解析程序中解析您的姓名。类似的东西:

<script src="http://maps.googleapis.com/maps/api/js"></script>
<script>
    var myCenter = new google.maps.LatLng(41.9976096,-87.6925979);

    function initialize() {
        var mapProp = {
            center:myCenter,
            zoom:16,
            scrollwheel:false,
            draggable:false,
            mapTypeId:google.maps.MapTypeId.ROADMAP
        };

        var map = new google.maps.Map(document.getElementById("googleMap"),mapProp);

        var marker = new google.maps.Marker({
            position:myCenter,
        });

        marker.setMap(map);
    }

    google.maps.event.addDomListener(window, 'load', initialize);
</script>

然后:

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;
  }
}

如果您使用C#6,您可以从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) }); 中受益和/或使用字典初始化程序使其更清晰:

nameof

字典创建过程也可以轻松自动化: - )