使用JSON.NET读取JSON

本文关键字:JSON 读取 NET 使用 | 更新日期: 2023-09-27 18:19:52

如何使用JSON.NET反序列化以下JSON:

{
"adjusted_amount":200.0,
"amount":2,
"uid":"admin",
"extra_params": {"uid":"admin","ip":"83.26.141.183","user_agent":"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.52 Safari/537.36"}
}

我有以下代码(但问题可能是"extra_params"——它不是字符串)。我曾想过为"extra_params"创建新的类,但问题是"extra-params"中的数据可能会更改。

我根本不需要读课外作业。我需要的所有信息都是从前3个JSON变量中获得的。

我的代码:

public class RecData1
{
    public string uid { get; set; }
    public int amount { get; set; }
    public int adjusted_amount { get; set; }
    public string extra_params { get; set; }
}
var data = JsonConvert.DeserializeObject<RecData1>(payload);

其中payload=粘贴在第一个报价中的字符串

编辑:我现在得到的错误:

Error reading string. Unexpected token: StartObject. Path 'extra_params', line 1,     position 28.
at Newtonsoft.Json.JsonReader.ReadAsStringInternal()
at Newtonsoft.Json.JsonTextReader.ReadAsString()
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.ReadForType(JsonReader reader, JsonContract contract, Boolean hasConverter)

使用JSON.NET读取JSON

您遇到的第一个问题是adjusted_aunt不是int,而是十进制(本地化也可能出现问题)。

其次,您可以在类RecData1中删除字符串extra_params,这将修复它

{
"adjusted_amount":200,
"amount":2,
"uid":"admin",
"extra_params": {"uid":"admin","ip":"83.26.141.183","user_agent":"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.52 Safari/537.36"}
}
public class RecData1
{
    public string uid { get; set; }
    public int amount { get; set; }
    public int adjusted_amount { get; set; }
    //public string extra_params { get; set; }
}

您可以使用dynamic:向前迈出一步

 dynamic x = JsonConvert.DeserializeObject(payload);
 var data = new RecData1()
                 {
                     uid = x.uid,
                     amount = x.amount,
                     adjusted_amount = x.adjusted_amount
                 };

我认为问题是因为您额外的param不是json中的字符串。

应该是这样的:

"extra_params": {"string........................................."}

它应该起作用。或者,您需要更改类以考虑另一个具有json中所有属性的对象。

如果你想获得extra_params,你可以试试这个:

public class RecData1
{
    public string uid { get; set; }
    public int amount { get; set; }
    public int adjusted_amount { get; set; }
    public Dictionary<string,string> extra_params { get; set; }
}
var data = JsonConvert.DeserializeObject<RecData1>(payload);