2016-02-17 3 views
0

Мне нужно извлечь часть json-string, используя .net или newtonsoft json.C# Parse/Deserialize JSON частично с Newtonsoft

JSON:

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

C# Класс:

class MyJson{ 
    public string method { get; set; } 
    //public string parameters {get; set;} 
    public object parameters {get; set;} 
} 
  1. мне не нужно разбирать все дети "параметров" JSon-объекта. «параметры» могут быть очень большим объектом ([{obj1} ... {obj1000}], objX из 1000 полей), синтаксический анализ, который не был бы выполнен. Я хотел бы, например, передать его точно так же, как в какой-то момент, поэтому преобразование «string-C# object-string» было бы излишним.
  2. Я не хочу использовать Regexp или строковые преобразования (string.Substring, Split и co), из-за поля ошибки, я знаю, что на всех строковых преобразованиях .net и newtonsoft.

Вопрос 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). 
} 

В идеальном случае: "параметры" является строкой и вызов

ExtractMyJson(jsonString) 

дает мне JSon строку параметров.

В основном мне нужна версия newtonsoft из

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

Примечание: пожалуйста, не ссылаться на «динамический» ключевое слово или спросить, почему нет строковые преобразования, это не очень конкретный вопрос.

+0

Вопрос в том, насколько велики будут параметры в худшем случае? Это действительно проблема? JSON.NET довольно быстро, и эта оптимизация, о которой вы думаете, может вообще не стоить. – Wapac

+0

Параметры: [{obj1} ... {obj1000}], objX из 1000 полей –

ответ

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.

+0

Спасибо, типы параметров неизвестны/сложны, изменены json. Если minuend «{img: 3, real: 4}» вместо «42», это сработает? - nope «Неожиданный символ» –

+0

Пока вы используете объект типа, он будет работать, потому что функция Newtonsoft DeserializeObject собирается передать его JObject, который является королем родового типа. Но если вам нужен контент, будет трудно получить к нему доступ. –

+0

Да, это то, что уже упоминалось в вопросе плюс «Вопрос 1». Я хотел бы знать, что такое JObject и разница между разбором всего в JObject и сильно типизированными объектами. –

0

Ну объекты обрабатываются так же, как обрабатывается ваш родительский объект. Он начнется с базы графика. Так что если у вас есть что-то вроде:

Person 
{ 
Address Address {get;set;} 
} 

Json начнет Десериализацию адреса, а затем добавить в объекте Person. Если вы хотите ограничить thesize глубины графика вы можете использовать параметр, как:

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

Для более конфигураций JsonSerializer проверить JsonSerializerSettings

Если поле является объект, то этот объект будет иметь KeyValuePair каждого свойства, которое он имеет, на основе этого, когда вы создаете это поле, вы можете получить доступ к этому типу (поведение такое же, как назначение типа объекту в C#).

Обновление: поэтому, если вы задаете вопрос с использованием JsonObject или типа, то JObject является и промежуточным способом для создания json-формата в общем формате.Но использование типа deserializatin означает, что вы можете игнорировать свойства, которые вам не интересны. Сопоставление с json с типом имеет больше смысла, потому что оно создает новый объект и отклоняет старый JObject.

+0

Глубина не должна быть ограничена, у меня нет контроля над «параметрами», я хочу иметь возможность передавать их как есть, поэтому стоимость времени процессора будет минимальной для меня, чтобы пересечь этот объект. В принципе, вы говорите, это невозможно сделать? –

+0

Затем, как @Alex Suleap, используйте общее сопоставление, чтобы вы могли получить к ним доступ. public Dictionary parameters {get; задавать; } – Mihai

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