2015-07-20 6 views
3

Я зову к API, который ожидает мои данные в формате, который выглядит следующим образом:Json/с проблемы # сериализации

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

Но у меня возникли проблемы, порождающих классов C# от этого. Первое имя свойства объекта-модификатора (1033306667720114200) не всегда одинаково. Кто-нибудь знает, как я могу создать класс, который при десериализации выдаст тот же json, что и в моем примере?

+3

Используйте словарь. – SLaks

+0

Возможный дубликат [Как я могу разобрать строку JSON, которая приведет к незаконным идентификаторам C#?] (Http://stackoverflow.com/questions/24536533/how-can-i-parse-a-json-string-that-would -cause-незаконный-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; } 
} 

и дальше, на заказ JSON конвертер для 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); 
    } 
} 

и ниже приведены примеры сериализации/десериализации обыкновений:

[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;} 
} 

EDIT

Основываясь на комментарий, это должно быть близко

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 выше в методе, делает модификатор похожим на {[,]} без значений. – 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? – r3plica

Смежные вопросы