2015-07-20 73 views
3

我打電話說預計,看起來像這樣的格式我的數據的API:的Json/C#序列化問題

{ 
    "cartId":null, 
    "id":"944990015513953203", 
    "quantity":"3", 
    "modifier":{ 
     "1033306667720114200":1033308953984892900 
    } 
} 

,但我有產生從一個C#類的問題。修飾符對象的第一個屬性名稱(1033306667720114200)並不總是相同的。 有誰知道我怎麼能創建一個類,當反序列化將輸出相同的JSON,如我在我的例子中所示?

+3

使用的字典。 – SLaks

+0

可能重複[如何解析會導致非法C#標識符的JSON字符串?](http://stackoverflow.com/questions/24536533/how-can-i-parse-a-json-string-that-would -cause-illegal-c-sharp-identifiers) –

+0

關於字典思想,你可以在修飾符值(比如數組對象)和花括號之間加上方括號。 否則,JSON會感覺有點尷尬,因爲它會像屬性名稱那樣對待某個鍵。 – Colin

回答

1

處理自定義JSON格式將是最簡單和最靈活的方式實現自定義的JSON.Net轉換器。以下是適用於您的json消息的示例實現。

首先是車類型

public class Cart 
{ 
    public long? cartId { get; set; } 
    public string id { get; set; } 
    public string quantity { get; set; } 
    public CartModifier modifier { get; set; } 
} 

[JsonConverter(typeof(CartModifierSerializer))] 
public class CartModifier 
{ 
    public CartModifier() 
    { 
     Values = new Dictionary<string, long>(); 
    } 

    public Dictionary<string, long> Values { get; set; } 
} 

和明年是定製的CartModifier類

public class CartModifierSerializer : JsonConverter { 
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     var modifier = value as CartModifier; 
     writer.WriteStartObject(); 
     foreach (var pair in modifier.Values) 
     { 
      writer.WritePropertyName(pair.Key); 
      writer.WriteValue(pair.Value); 
     } 
     writer.WriteEndObject(); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     var jsonObject = JObject.Load(reader); 
     var properties = jsonObject.Properties().ToList(); 
     return new CartModifier 
     { 
      Values = properties.ToDictionary(x => x.Name, x => (long) x.Value) 
     }; 
    } 

    public override bool CanConvert(Type objectType) 
    { 
     return typeof(CartModifier).IsAssignableFrom(objectType); 
    } 
} 

JSON轉換器及以下的例子序列化/反序列化用途:

[Test] 
public void TestSerialization() 
{ 
    var cart = new Cart() 
    { 
     id = "944990015513953203", 
     quantity = "3", 
     modifier = new CartModifier() 
     { 
      Values = 
      { 
       {"1033306667720114200", 1033308953984892900} 
      } 
     } 
    }; 
    Console.WriteLine(JsonConvert.SerializeObject(cart)); 
} 

[Test] 
public void TestDeseriazliation() 
{ 
    var data = "{\"cartId\":null, \"id\":\"944990015513953203\",\"quantity\":\"3\",\"modifier\":{ \"1033306667720114200\":1033308953984892900 }}"; 
    var cart = JsonConvert.DeserializeObject<Cart>(data); 
    Assert.AreEqual(cart.modifier.Values["1033306667720114200"], 1033308953984892900); 
} 
2

您可以將修飾符值打包到字典中。

public class MyObject 
{ 
    public long Id {get;set;} 
    public long? CartId {get;set;} 
    public int Quantity {get;set;} 
    public Dictionary<object, object> Modifier {get;set;} 
} 

編輯

基於評論這應該是接近

public class RootObject 
{ 
    public object cartId { get; set; } 
    public string id { get; set; } 
    public string quantity { get; set; } 
    public Modifier modifier { get; set; } 
} 

public class Modifier 
{ 
    public long _1033306667720114200 { get; set; } 
} 
+0

這對我不起作用,發佈上述json的方法使得Modifier看起來像{[,]}沒有值。 – r3plica

+0

OIC ..「1033306667720114200」實際上是一個對象名稱。解決方法是修改器是一種名爲「1033306667720114200」的類型,但這將是無效的....我要編輯 – drooksy

+0

不,這也行不通。修飾符(你的類)有一個靜態名稱,但Json屬性名稱會改變。 – r3plica

0

使用LinkedHashMap的

LinkedHashMap<String, String> jsonOrderedMap = new LinkedHashMap<String, String>(); 

    jsonOrderedMap.put("1","red"); 
    jsonOrderedMap.put("2","blue"); 
    jsonOrderedMap.put("3","green"); 

    JSONObject orderedJson = new JSONObject(jsonOrderedMap); 

    JSONArray jsonArray = new JSONArray(Arrays.asList(orderedJson)); 
+0

不是LinkedHashMap是一個Java only對象嗎? – r3plica