2014-04-17 56 views
2

在C#中使用Json.NET时,序列化类时出现问题,其中需要定制属性名称。序列化时在Json.NET中使用特定的属性名称

这是我现在有:

{ 
    "baseName": { 
    "subName1": { 
     "name": null, 
     "longName": null, 
     "asd1": null, 
     "asd2": null 
    }, 
    "subName2": [ 
     { 
     "id": "ID_NUMBER", 
     "info": { 
      "someInfo1": "asd", 
      "someInfo2": "asd2" 
     } 
     } 
    ] 
    } 
} 

这就是我想要

{ 
    "baseName": { 
    "subName1": { 
     "name": null, 
     "longName": null, 
     "asd1": null, 
     "asd2": null 
    }, 
    "subName2": [ 
     { 
     "ID_NUMBER": { 
      "someInfo1": "asd", 
      "someInfo2": "asd2" 
     } 
     } 
    ] 
    } 
} 

也就是说,是不是具有id和价值ID_NUMBER的关键,我想ID_NUMBER是包含密钥someInfo1someInfo2的对象的关键。

class JSONTestClass 
{ 
    public JSONBaseTestClass baseName; 
} 

class JSONBaseTestClass 
{ 
    public JSONSubTestClass1 subName1; 
    public List<JSONSubTestClass2> subName2; 
} 

class JSONSubTestClass1 
{ 
    public string name; 
    public string longName; 
    public string asd1; 
    public string asd2; 
} 

class JSONSubTestClass2 
{ 
    public string id; 
    public JSONInfoTestClass info; 
} 

class JSONInfoTestClass 
{ 
    public string someInfo1; 
    public string someInfo2; 
} 

这:

使用这些类(遗憾的坏话)中最严重的JSON代码

private void MakeJSON() 
{ 
    // This value can be changed at runtime 
    string specificId = "ID_NUMBER"; 

    JSONInfoTestClass jitc = new JSONInfoTestClass(); 
    jitc.someInfo1 = "asd"; 
    jitc.someInfo2 = "asd2";    

    JSONTestClass jtc = new JSONTestClass(); 

    JSONBaseTestClass jbtc = new JSONBaseTestClass(); 

    JSONSubTestClass1 jstc1 = new JSONSubTestClass1(); 

    JSONSubTestClass2 jstc2 = new JSONSubTestClass2(); 
    jstc2.id = specificId; 
    jstc2.info = jitc; 

    List<JSONSubTestClass2> list = new List<JSONSubTestClass2>(); 
    list.Add(jstc2); 

    jbtc.subName1 = jstc1; 
    jbtc.subName2 = list; 

    jtc.baseName = jbtc; 

    // Convert to JSON 
    string json = JsonConvert.SerializeObject(jtc, Formatting.Indented); 
    tbxJSONOutput.Text = json; 
} 

哪些是需要改变这样我就可以得到相应的一个JSON输出到上面提到的第二个JSON响应?

回答

1

你可以为你的JSONSubTestClass2类这样创建自定义JsonConverter得到你想要的输出:

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

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     JSONSubTestClass2 jstc2 = (JSONSubTestClass2)value; 
     JObject jo = new JObject(); 
     jo.Add(jstc2.id, JObject.FromObject(jstc2.info)); 
     jo.WriteTo(writer); 
    } 

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

然后,序列化你这样的类:

JsonSerializerSettings settings = new JsonSerializerSettings(); 
settings.Converters.Add(new JSONSubTestClass2Converter()); 
settings.Formatting = Formatting.Indented; 

// Convert to JSON 
string json = JsonConvert.SerializeObject(jtc, settings); 
+0

非常感谢!精彩的工作:) – eightx2

+0

很高兴我能帮上忙。 –

相关问题