从集合中反序列化匿名类型

时间:2017-05-12 07:02:42

标签: c# json json.net

我有这种格式的序列化JSON:

private void btnAClicked(){};
private void btnBClicked(){};
private void btnCClicked(){};


JButton c = new JButton("c");
    c.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
           btnCClicked();
           btnAClicked(); 
           btnBClicked();              

        }
    });

如何将其反序列化为单个匿名对象,如下所示:

string json = @"[{"Name": "std_id","Value": "111"}, {"Name": "cust_id","Value": "444"}]"

4 个答案:

答案 0 :(得分:1)

为什么是匿名对象?你应该反序列化为类似下面的类型

public class RootObject
{
    public string Name { get; set; }
    public string Value { get; set; }
} 

那么你实际拥有的是IEnumerable<RootObjct>。您可以使用Linq并从中选择First(),如

RootObject = RootObjects.FirstOrDefault()

答案 1 :(得分:1)

您可以将其反序列化为动态。像这样:

var serializer = new JavaScriptSerializer();
var deserializedResult = serializer.Deserialize<dynamic>(json);

参考:

答案 2 :(得分:0)

var definition = new { Name = "" };
string json1 = @"{'Name':'James'}";
var customer1 = JsonConvert.DeserializeAnonymousType(json1, definition);
Console.WriteLine(customer1.Name);
string json2 = @"{'Name':'Mike'}";
var customer2 = JsonConvert.DeserializeAnonymousType(json2, definition);
Console.WriteLine(customer2.Name);

来源http://www.newtonsoft.com/json/help/html/DeserializeAnonymousType.htm

答案 3 :(得分:0)

我知道这个解决方案并不完美,但它适用于您提供的示例,并在您的示例中返回类似paramObj的结果。

我们的想法是创建一个自定义的Json转换器。

首先,让我们创建一个DTO类来呈现一个包含JSON的名称 - 值项。

public class NameValueJsonItem
{
    public string Name { get; set; }

    public string Value { get; set; }
}

转换器实施:

public class DynamicJsonConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return true;
    }

    public override object ReadJson(JsonReader reader, Type objectType, 
        object existingValue, JsonSerializer serializer)
    {        
        JToken token = JToken.Load(reader);

        if (token == null || token.Type != JTokenType.Array)
        {
            return null;
        }

        List<NameValueJsonItem> parsedJson = token.ToObject<List<NameValueJsonItem>>();

        ExpandoObject result = new ExpandoObject();

        foreach (NameValueJsonItem item in parsedJson)
        {
            if (!String.IsNullOrEmpty(item.Name))
            {
                (result as IDictionary<string, object>)[item.Name] = item.Value;
            }
        }

        return result;
    }

    public override void WriteJson(JsonWriter writer, object value, 
        JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

当然,如果您愿意,可以通过在方法中添加一些异常处理等来使其更安全。

您可以像这样使用此转换器:

dynamic result = JsonConvert.DeserializeObject<dynamic>(json, new DynamicJsonConverter());

希望它会有所帮助。