使用Newtonsoft将Json值转换为Integer

时间:2015-04-28 02:38:03

标签: xml json json.net

我使用以下代码向xml添加属性,以指定在使用JsonConvert.SerializeXmlNode时此节点应返回Integer值。

我已将Newtonsoft的更新合并到我引用的dll中。

我使用以下代码添加属性:

f
units ~ station_nbr + date + store_nbr + tmax + tmin + tavg + 
    dewpoint + wetbulb + heat + cool + snowfall + preciptotal + 
    stnpressure + resultspeed + avgspeed + event + RA + BR + 
    FZ + FG + SN + TS + DZ + BL + DU + SQ + FU + GR + GS + weekdays

其中ele.SetAttribute("Integer", "http://james.newtonking.com/projects/json", "true"); 来自ele

结果总是以这样的结果:

XmlElement ele = node as XmlElement;

但我需要的是

 "id": {
        "@Type": "Integer",
        "#text": "759263947"
      },

请注意,我使用完全相同的语法来识别数组:

"id": 759263947

工作正常。

劳拉

1 个答案:

答案 0 :(得分:3)

如果您使用this answer中描述的XmlNodeConverter的变体版本,可在此处找到:https://github.com/lukegothic/Newtonsoft.Json/blob/master/Src/Newtonsoft.Json/Converters/XmlNodeConverter.cs,则看起来您需要这样做:

ele.SetAttribute("Type", "http://james.newtonking.com/projects/json", "Integer");

或者,对于双倍值:

ele.SetAttribute("Type", "http://james.newtonking.com/projects/json", "Float");

或者,您可以使用Linq-to-JSON开箱即用手动修改转换字符串值为数值,例如:

        string xml = @"<fulfillment xmlns:json=""http://james.newtonking.com/projects/json""><tracking_number>937467375966</tracking_number><tracking_url>google.com/search?q=937467375966</tracking_url>; <line_items json:Array=""true""><id>759263947</id><quantity>1.00000</quantity></line_items></fulfillment>";
        var doc = new XmlDocument();
        doc.LoadXml(xml);

        var obj = JObject.Parse(JsonConvert.SerializeXmlNode(doc));
        foreach (var value in obj.Descendants().OfType<JValue>().Where(v => v.Type == JTokenType.String))
        {
            long lVal;
            if (long.TryParse((string)value, out lVal))
            {
                value.Value = lVal;
                continue;
            }
            double dVal;
            if (double.TryParse((string)value, out dVal))
            {
                value.Value = dVal;
                continue;
            }
            decimal dcVal;
            if (decimal.TryParse((string)value, out dcVal))
            {
                value.Value = dcVal;
                continue;
            }
        }
        var json = obj.ToString();
        Debug.WriteLine(json);