C#使用Newtonsoft

时间:2016-02-17 09:01:21

标签: c# json string object json.net

我必须使用.net或newtonsoft json提取json-string的一部分。

JSON:

var json = "{\"method\":\"subtract\",\"parameters\":{\"minuend\":\"SOME_CUSTOM_JSON_OBJECT_DIFFERENT_FOR_EACH_METHOD\",\"subtrahend\":23}}";

C#Class:

class MyJson{
    public string method { get; set; }
    //public string parameters {get; set;}
    public object parameters {get; set;}
}
  1. 我不需要解析"参数"的所有孩子。 JSON对象。 "参数"可能是一个非常大的对象([{obj1} ... {obj1000}],1000个字段的objX),解析不具备性能。 我想在某些方面完全按原样传递它,所以转换" string-C#object-string"这将是多余的。
  2. 我不想使用Regexp或字符串转换(string.Substring,Split和co),因为有误差,我知道所有.net和newtonsoft字符串转换都是基于。
  3. 问题1:如果我定义类型"对象"的属性,newtonsoft将如何处理这个? (文档比msdn更糟糕,所以我正在寻找你已经尝试过的人的输入。)

    static void Main(string[] args)
    {
         var json = "{\"method\":\"subtract\",\"parameters\":{\"minuend\":42,\"subtrahend\":23}}";
         var data = JsonConvert.DeserializeObject<MyJson>(j);
    
         // what internal representaion of data.parameters?
         // How is it actually converted from json-string to an C# object (JObject/JsonObject).
    }
    

    完美的情况: &#34;参数&#34;是一个字符串并调用

    ExtractMyJson(jsonString)
    

    给了我json参数字符串。

    基本上我需要newtonsoft版本的

    string ExtractMyJson(jsonString){
      var p1 = jsonString.Split(",");
      // .. varios string transformations
      return pParams;
    }
    

    注意:请不要参考&#34;动态&#34;关键字或问为什么没有字符串转换,这是非常具体的问题。

3 个答案:

答案 0 :(得分:0)

如果您知道您的参数是唯一的,您可以执行以下操作:

class MyJson
{
    public string method { get; set; }
    public Dictionary<string,object> parameters { get; set; }
}
................
string json = "{\"method\":\"subtract\",\"parameters\":{\"minuend\":{\"img\": 3, \"real\": 4},\"subtrahend\":23}}";
var data = JsonConvert.DeserializeObject<MyJson>(json);

如果你让它作为对象将接收类型Newtonsoft.Json.Linq.JObject。

答案 1 :(得分:0)

井对象的处理方式与处理父对象的方式相同。它将从图的基础开始。所以如果你有类似的东西:

Person
{
 Address Address {get;set;}
}

Json将开始反序列化地址,然后添加Person对象。 如果要限制图形深度的大小,可以使用如下设置:

JsonConvert.DeserializeObject<List<IList<IList<string>>>>(json, new JsonSerializerSettings
 {
    MaxDepth = 2
 });

有关JsonSerializer的更多配置,请选中JsonSerializerSettings

如果你的字段是一个对象,那么该对象将具有它所拥有的每个属性的KeyValuePair,基于当你转换该字段时你可以访问该类型。(行为与为对象分配类型相同)在C#)。

更新:所以如果你使用JsonObject或类型提问,那么JObject就是以通用格式构造json格式的中间方式。但是使用Type deserializatin意味着你可以忽略你不感兴趣的属性。映射到带有类型的json更有意义,因为它创建了一个新对象并且解散了旧的JObject。

答案 2 :(得分:0)

您尝试过JTOKEN吗?

这是一种相当简单的解决方案,可以部分读取post中所述的基本或嵌套JSON。

对于嵌套的JSON

{ 
"key1": {
            "key11": "value11",
            "key12": "value12"
         }
"key2": "value2"
}

它看起来像这样

JToken token = JToken.Parse(json);
var value12 = token.SelectToken("key1.key12");

获取键"key12的元素。

我认为这可以很好地解决您的问题。