如何通过从c#对象中删除空值属性和零(0)值属性来优化json

时间:2014-12-11 05:57:38

标签: c# xml json json.net

情境:

我必须发送一个Httpwebrequest和服务器要求它只接受两个值作为Json格式,我想再向另一个服务器发送一个请求,并且一次需要一个JSON格式的值。

对于上面的场景,我创建了一个Class并提供了所有三个属性,如下面的

pubilc class MyClass
{
    public string as { get; set;}
    public int value { get; set;}
    public string asd { get;s et;}
}

对于第一个HttpWebRequest,对于第一个服务器,我只想从MyClass发送两个属性'作为'和' asd'现在我将序列化NewtonSoft的JsonConvert函数,如下所示

MyClass class = new MyClass();
string json = JsonConvert.SerializeObject(class);

上面的语法将返回具有0和null值属性的json,NewtonSoft提供了从Json中删除null值的函数,但是它不能删除值为0的属性,或者你可以说你的属性数据类型是int,并且没有分配任何值,而是为这些属性赋值。

从Json中删除Null属性的语法

string json = JsonConvert.SerializeObject(class, Newtonsoft.Json.Formatting.Indented, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore });

上述语法将在序列化MyClass对象期间删除空值。

现在询问如果属性为0,则如何从json中删除属性。

3 个答案:

答案 0 :(得分:5)

您可以尝试将int属性定义为可为空:

public int? value { get; set;}

答案 1 :(得分:1)

我接受的mgigirey给出的答案,我做的另一个解决方案,我将我的Json转换为xml 并删除了值为0的节点并再次转换为Json。我的解决方案也适用于我,但它比Mgigirey回答有点冗长和慢。

所以这里有两个答案,如果你有人想要我的解决方案,那么请看下面的内容。

//This line will remove the null as i earlier mentioned in my question.
string jsonStatus = JsonConvert.SerializeObject(myJson, Newtonsoft.Json.Formatting.Indented, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore });

//Create xml object by covnert json into xml
XmlDocument doc = (XmlDocument)JsonConvert.DeserializeXmlNode(json);

//Get the property name which have the value 0
var v = doc.GetElementsByTagName("value")[0];

//Remove the child node.
doc.DocumentElement.RemoveChild(v);

//Again convert into the json.
string jsonText = JsonConvert.SerializeObject(doc);

答案 2 :(得分:1)

只需修改您的表情

string json = JsonConvert.SerializeObject(
  class, 
  Newtonsoft.Json.Formatting.Indented, 
  new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }
);

如下,

string json = JsonConvert.SerializeObject(
  class, 
  Newtonsoft.Json.Formatting.Indented, 
  new JsonSerializerSettings { 
    NullValueHandling = NullValueHandling.Ignore,
    DefaultValueHandling = DefaultValueHandling.Ignore 
  }
);