簡體   English   中英

Json / c#序列化問題

[英]Json / c# serialisation problems

我正在調用一個API,它希望我的數據格式如下:

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

但是我遇到了生成ac#class的問題。 修飾符對象的第一個屬性名稱(1033306667720114200)並不總是相同。 有誰知道如何創建一個類,當反序列化將輸出相同的json,如我在我的示例中所示?

您可以將修改器值打包到字典中。

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

處理自定義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類的自定義json轉換器

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

使用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));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM