2013-03-22 62 views
7

Hi Tôi đang sử dụng các lớp bên dướiLàm thế nào để loại bỏ giá trị null trong chuỗi json

Public List<string> name; 
Public List<string> midname; 

Khi tôi serialize nó tôi nhận được đầu ra sau như

{"name":[hari],"midname":null} 

Nhưng tôi muốn câu trả lời của tôi để được như thế này

{"name":[hari]} 

Nó không hiển thị thuộc tính lớp có giá trị null và tôi đang sử dụng khung C# .net.

+3

Bạn đang sử dụng gì để thực hiện tuần tự hóa? Điều đó sẽ hữu ích khi biết cách cung cấp câu trả lời ... –

+0

Tôi nghĩ linq có thể thực hiện được điều này. –

+0

cách bạn sắp xếp thứ tự, công cụ bạn đang sử dụng? –

Trả lời

13

Câu trả lời đầy đủ tùy thuộc vào cách bạn đang sắp xếp lớp của mình.

Nếu bạn đang sử dụng hợp đồng dữ liệu để serialize lớp học của bạn, thiết lập EmitDefaultValue = false

[DataContract] 
class MyClass 
{ 
    [DataMember(EmitDefaultValue = false)] 
    public List<string> name; 

    [DataMember(EmitDefaultValue = false)] 
    public List<string> midname { get; set; } 
} 

Nếu bạn đang sử dụng Json.Net, hãy thử này để thay thế

class MyClass 
{ 
    [JsonProperty(NullValueHandling = NullValueHandling.Ignore)] 
    public List<string> name; 

    [JsonProperty(NullValueHandling = NullValueHandling.Ignore)] 
    public List<string> midname { get; set; } 
} 

Hoặc thiết lập nó trên toàn cầu với JsonSerializerSettings.NullValueHandling = NullValueHandling.Ignore

7

Nếu bạn đang sử dụng Json.Net thì bạn có thể thử điều này bằng cách Trang trí thuộc tính của bạn như thế này

[JsonProperty(NullValueHandling = NullValueHandling.Ignore)] 
public List<string> name { get; set; } 
3
private class NullPropertiesConverter : JavaScriptConverter 
{ 
    public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    } 

    public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer) 
    { 
     var jsonExample = new Dictionary<string, object>(); 
     foreach (var prop in obj.GetType().GetProperties()) 
     { 
      //check if decorated with ScriptIgnore attribute 
      bool ignoreProp = prop.IsDefined(typeof(ScriptIgnoreAttribute), true); 

      var value = prop.GetValue(obj, BindingFlags.Public, null, null, null); 
      if (value != null && !ignoreProp) 
       jsonExample.Add(prop.Name, value); 
     } 

     return jsonExample; 
    } 

    public override IEnumerable<Type> SupportedTypes 
    { 
     get { return GetType().Assembly.GetTypes(); } 
    } 
} 

Sau đây là cách bạn sẽ sử dụng ở trên và nó sẽ bỏ qua các giá trị null.

var serializer = new JavaScriptSerializer(); 
    serializer.RegisterConverters(new JavaScriptConverter[] { new NullPropertiesConverter() }); 
    return serializer.Serialize(someObjectToSerialize); 

Source

+0

Câu trả lời tuyệt vời mà không cần sử dụng thư viện của bên thứ ba VÀ không cần phải thay đổi các lớp được sắp xếp theo thứ tự. –

1

chuỗi signatureJson = JsonConvert.SerializeObject (chữ ký, Newtonsoft.Json.Formatting.Indented, JsonSerializerSettings mới {NullValueHandling = NullValueHandling.Ignore});

0

Giống như p.s.w.g cho biết, tốt nhất để sắp xếp đúng cách ngay từ đầu. Ví dụ về tuần tự hóa không có null có thể được xem here

ví dụ:

var json = JsonConvert.SerializeObject(
     objectToSerialize, 
     new JsonSerializerSettings {NullValueHandling = NullValueHandling.Ignore}); 
Các vấn đề liên quan