Я ожидаю два отдельных json в случае успеха и неудачи.

В случае успеха я получаю вложенный json, тогда как в случае неудачи я получаю простой json с упоминанием статуса: failed, поэтому мой класс, который я использовал для обработки успеха, терпит неудачу из-за сценария сбоя. Может кто-нибудь, пожалуйста, руководство здесь? Единственный способ, которым я могу думать о проверке подстроки json и проверке перед разбором, но это не кажется хорошим решением.

Обновленные Jsons: Успех:

{
    "Subscriptions": [
        {
            "Subscription": {
                "SAPOrder": "SAP123",
                "RequestType": "New",
                "OrderStatus": "0",
                "Services": [
                    {
                        "Service": [{
                            {
                                "attribute": {
                                    "name": "Resilience",
                                    "value": "Terminated"
                                }
                            },
                            {
                                "attribute": {
                                    "name": "Number",
                                    "value": "1234"
                                }
                            },
                            {
                                "attribute": {
                                    "name": "serviceStartDate",
                                    "value": "2018-08-220T02:13:20"
                                }
                            }
                        },
                            {{
                                "attribute": {
                                    "name": "Resilience",
                                    "value": "Terminated"
                                }
                            },
                            {
                                "attribute": {
                                    "name": "Number",
                                    "value": "1234"
                                }
                            },
                            {
                                "attribute": {
                                    "name": "serviceStartDate",
                                    "value": "2018-08-220T02:13:20"
                                }
                            }
                        }
                        ]
                    }
                ]
            }
        }
    ]
}

Ошибка:

  {
        "Subscriptions": [
            {
                "Subscription": {
                    "SAPOrder": "SAP123",
                    "RequestType": "New",
                    "OrderStatus": "Failed"
                }
            }

Добавлены сведения о классе:

public class JSON2Apex {

    public class Services {
        public List<Service> Service;
    }

    public List<Subscriptions> Subscriptions;

    public class Attribute {
        public String name;
        public String value;
    }

    public class Subscriptions {
        public Subscription Subscription;
    }

    public class Service {
        public List<Attribute> attribute;
    }

    public class Subscription {
        public String SAPOrder;
        public String RequestType;
        public String OrderStatus;
        public List<Services> Services;
    }


    public static JSON2Apex parse(String json) {
        return (JSON2Apex) System.JSON.deserialize(json, JSON2Apex.class);
    }
}
0
shukla yogesh 18 Сен 2018 в 14:53
Вы также можете опубликовать класс вершины?
 – 
Oleksandr Berehovskyi
17 Сен 2018 в 15:09
Я добавил детали класса ..
 – 
shukla yogesh
18 Сен 2018 в 14:55

2 ответа

Здесь ничего дополнительно делать не нужно. Как я вижу из ваших ответов, у вас по-прежнему есть все атрибуты в error JSON, за исключением массива Services, который вы получаете только в успехе. .

"Subscription": {
       "SAPOrder": "SAP123",
       "RequestType": "New",
       "OrderStatus": "0",
}

Итак, пока ваш класс-оболочка имеет следующий формат:

public class SubscriptionWrapper {
    public Subscription subscription;
    ....
}

public class Subscription {
    public String SAPOrder;
    public String RequestType;
    public String OrderStatus;
    public List<Services> services
}

И что вы получаете ошибку или успех в переменной OrderStatus, а при десериализации вашего ответа вы получаете только то, что находится в JSON. Если List<Services> присутствует в JSON в случае успеха, вы также получите это при десериализации, иначе нет.

Затем вы используете значение OrderStatus, чтобы определить, получили ли вы сообщение об успехе или ошибке, и используете его соответствующим образом по мере необходимости.

Например, приведенный ниже код будет работать без каких-либо проблем независимо от того, есть ли у вас все атрибуты в сообщении JSON или нет.

String jsonStr = '{\"OrderStatus\": \"Success\"}';

Subscription subsc = (Subscription)JSON.deserialize(jsonStr, Subscription.class);
system.debug('Order Status:' + subsc.OrderStatus);
3
Jayant Das 17 Сен 2018 в 16:35
Да, это моя проблема. Я не вижу статус заказа, потому что синтаксический анализ завершится ошибкой из-за того, что list не найден. Любая альтернатива для этого?
 – 
shukla yogesh
17 Сен 2018 в 16:28
Вы уже пробовали разбирать? Я могу сказать вам, если JSON не содержит атрибута в сообщении, и что при десериализации ответа ваш List<Services> будет просто инициализирован null.
 – 
Jayant Das
17 Сен 2018 в 16:29
И я добавил образец «рабочего примера». Так что вы должны сначала попробовать синтаксический анализ - он не подведет.
 – 
Jayant Das
17 Сен 2018 в 16:36
1
Вы должны проверить свою реализацию и JSON, чтобы убедиться, что они соответствуют вашему классу-оболочке. Потому что у вас здесь нет класса-оболочки, а тот, который я разместил в примере, прекрасно работает без атрибута, присутствующего в JSON.
 – 
Jayant Das
18 Сен 2018 в 15:57
1
Проблема с вашим JSON. Если предполагается, что Services является массивом значений, то, если он вообще присутствует в JSON, его следует отправлять как Services : [], а не как null. Однако в вашем вопросе казалось, что этот массив никогда не отправляется в JSON. Но в любом случае, пока ваш JSON отправляет данные на основе своей схемы, ваш синтаксический анализ будет работать нормально.
 – 
Jayant Das
18 Сен 2018 в 16:36

Вы можете создать виртуальный класс, чтобы иметь статус вашего запроса, и после этого вы можете расширить этот класс другим, содержащим поля успешного ответа. Например.

public virtual class BaseResponse {
    public String status {get; set;}
    public String error {get; set;}
}

public class YourResponse extends BaseResponse {
    public List<String> yourDate {get; set;}
}

После этого вы можете разобрать ответ следующим образом:

YourResponse response = (YourResponse) JSON.deserialize(body, YourResponse .class);
if(response.status == 'success'){
    // do actions on success
} else if(response.status == 'failed'){
    // whos error message e.g. response.error
}

Этот виртуальный класс позволяет вам создавать другие классы, которые также имеют эти ответы успеха-неудачи

0
Oleksandr Berehovskyi 17 Сен 2018 в 14:59
Спасибо Александр. Я обновил вопрос с помощью jsons. Мой класс терпит неудачу в случае второго json.
 – 
shukla yogesh
17 Сен 2018 в 15:04