首页 > 解决方案 > 从 XML 转换后,如何在 JSON 中获取不带引号的数值

问题描述

我有一个来自 SQL Server 中存储过程的 XML,这个 XML 被转换为 JSON,然后从 Web API 方法返回。

这就是我将 XML 转换为 JSON 的方式

XmlDocument doc = new XmlDocument();
doc.LoadXml(reportXmlString);
string jString = JsonConvert.SerializeXmlNode(doc);
JObject jObject = JObject.Parse(jString);
return jObject;

我想将 JSON 中的数值作为数字......不带引号

我现在拥有的

{
"Report": {
    "ReportItem": [
        {
            "Name": "MyObjectName",
            "Revenue": "99999.45"
        }
    ]
}
}

我想拥有的

{
"Report": {
    "ReportItem": [
        {
            "Name": "MyObjectName",
            "Revenue": 99999.45
        }
    ]
}
}

我没有这个 XML 的任何类,我没有将它映射到任何地方,我只是从存储过程接收 XML,将其转换为 JSON 并将其返回给用户。

这是我正在解析为 JSON 的 XML

<Report xmlns:json="http://james.newtonking.com/projects/json">
<ReportItem>
    <Name>MyObjectName</Name>
    <Revenue>99999.45</Revenue>
</ReportItem>
</Report>

有没有办法在不为每个字段创建具有类型的类的情况下做到这一点?

谢谢。

标签: c#jsonsql-serverxmlasp.net-web-api

解决方案


有点乱,但您可以编写自己的 JsonConverter (如果它们也以字符串形式出现,这不会修复所写的布尔值):

class NumberConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(string);
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        if (Double.TryParse(value.ToString(), out var d))
        {
                writer.WriteValue(d);
        }

        else
        {
                writer.WriteValue(value.ToString());
        }
    }

    public override bool CanRead => false;

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

然后像这样使用它:

XmlDocument doc = new XmlDocument();
doc.LoadXml(xmlString);
string jString = JsonConvert.SerializeXmlNode(doc);
JObject jObject = JObject.Parse(jString);

var fixedString = JsonConvert.SerializeObject(jObject, new NumberConverter());
var fixedObject = JObject.Parse(fixedString);

return fixedObject;

推荐阅读